Смекни!
smekni.com

Программирование и разработка приложений в Maple (стр. 120 из 135)

{+|+1|+2} обозначает, что Maple использует этот файл с {высшим|первым|вторым} уровнем приоритета соответственно, тогда как при “–“ Maple игнорирует файл "Maple.ini".

Релиз

B

L

U

B, L

B, U

L, U

B, L, U

6

+

+

B

+1, +2

U

B, U

7

+

+

L

U

+1, +2

L, U

8

+

+

L

U

+1, +2

L, U

9

+

+

+

+2, +1

+, –

+1, +2

+2, +1, –

10

+

+

L

U

U

U

Таким образом, заштрихованный U-столбец определяет каталог USERS, файл "maple.ini" которого используется пакетом всех релизов 6 - 10, однако для 9-го релиза данный файл игнорируется, если каталог BIN.WIN также содержит подобный файл. В столбцах <B, L>, <B, U> и <L, U> затенены клетки, которые определяют вышеупомянутые каталоги, целесообразные для того, чтобы определить местоположение файлов "Maple.ini"для их приоритетного использования пакетом. Данные файлы могут содержать любую полезную информацию инициализации как определенного, так и общего характера, включая определения процедур, модулей либо их вызовов. В конкретном случае нашей Библиотеки [103,109] данный файл расположен в U-каталоге и используется для организации логической связи с главной Maple-библиотекой пакета. На основе файла "Maple.ini" имеется возможность поддерживать достаточно эффективные и простые механизмы связей пользовательских библиотек. Рекомендуется располагать данный инициализационный файл именно в каталоге USERS пакета.

Этап 6. Пополнение созданной библиотеки новыми средствами можно выполнять согласно этапам 3 – 4, представленным выше. Однако для этих целей вполне подойдет и весьма простая процедура uplib, обеспечивающая пополнение библиотеки, заданной полным путем L, Maple-объектами, имена Р которых могут быть представлены как в единственном числе, так и их списком либо множеством. Перед вызовом процедуры uplib(L, P) определения сохраняемых в L-библиотеке Maple-объектов Р должны быть предварительно вычислены. В следующем фрагменте приведен исходный текст процедуры uplib и пример ее применения для обновлений UserLib-библиотеки программным модулем М. Там же представлен пример и более общей процедуры UpLib [41,42,103,109]:

uplib := (L::{string, symbol}, P::{symbol, list(symbol), set(symbol)}) → op([ assign('savelibname' = L), savelib `if`(( type(P, {'list', 'set'}), op(P), P)),

unassign '( savelibname')])

> M:= module() export x; x:= () -> `*`(args)/nargs end module:

> uplib("C:&bsol;Program Files&bsol;Maple 10&bsol;UserLib", M);

> restart; M:- x(64, 59, 39, 10, 17, 44), with(M); x(64, 59, 39, 10, 17, 44), eval(x);

183589120, [x]

`*`(args)

183589120, ( ) →

nargs

> march('list', "C:&bsol;Program Files&bsol;Maple 10&bsol;UserLib");

[["Ds.m", [2006, 10, 2, 10, 24, 18], 1090, 115], ["Sr.m", [2006, 10, 2, 10, 24, 18], 1024, 66],

["M.m", [2006, 10, 2, 16, 15, 15], 1205, 70], [":-1.m", [2006, 10, 2, 16, 15, 15], 1275, 85]]

UpLib := proc(L::{string, symbol}, N::list(symbol)) local a b c d h k p t n, , , , , , , , ; assign(n = nops(N), a = [ ], p = [libname], t = cat(CDM( ), "/lib/", L)); if member(cat "",( L)[2 .. 3], {":/" ":&bsol;", }) and type( ,L 'mlib') then h := cat "",( L) elif type ,(t 'mlib') then h := t else for k to nops(p) do if Search1(Case cat(( "&bsol;", L)), CF(p k[ ]), ' 'd ) and d = ['right'] then h := p k[ ]; break

end if

end do

end if; `if` type( ,( h 'symbol'), ERROR "<%1> is not a Maple library",( L), seq(`if`( type(N k[ ], {`module`, 'procedure', 'table'}), assign(' 'a = [op(a), N k[ ]]), WARNING "<%1> is not a procedure and not a module, and not a table,"(

N k[ ])), k = 1 .. n)); `if`(nops(a) = 0, ERROR("procedures, modules or tables do not exist for saving"), assign(b = NLP(L)[1]));

for k to nops(a) do

if member(a k[ ], b) or Search1(cat(a k[ ], `:-`), a k[ ], ' 'd ) and d = ['left'] then WARNING "<%1> does exist and will be updated", [ ]( a k )

else WARNING("<%1> does not exist and will be added", a[k]) end if end do; assign(c = savelibname ), assign('savelibname' = h), savelib op(( a));

unassign '( savelibname'), assign(savelibname = c),

WARNING("Library update has been done!")

end proc

> UpLib("C:/Program Files/Maple 10/LIB/UserLib", [BootDrive]);

Warning, <BootDrive> does exist and will be updated Warning, Library update has been done!

В данном фрагменте вычисляется определение процедуры uplib и программного модуля М, предназначенного для сохранения в существующей (созданной на предыдущих этапах работы) библиотеке "c:&bsol;program files&bsol;Maple 10&bsol;UserLib". По вызову процедуры uplib("C:&bsol;Program Files&bsol;Maple 10&bsol;UserLib", M) производится сохранение модуля М в указанной первым аргументом библиотеке. Успешный вызов процедуры uplib возвращает NULL-значение, т.е. ничего. Последующий вызов экспорта х модуля М после restartпредложения подтверждает корректность выполненной операции обновления UserLibбиблиотеки модулем М. При этом, предполагалось, что на этапе 5 созданная UserLib-библиотека была логически сцеплена с главной Maple-библиотекой (через libname-переменную) посредством файла “Maple.ini” в USERS-каталоге пакета. Затем пример фрагмента представляет вывод нового состояния UserLib-библиотеки, в котором кроме m-файла с модулем М представлен и сопутствующий ему m-файл ":-1.m"; с такого типа файлами библиотеки можно детально ознакомиться в наших книгах [41-43,103].

Тогда как вторая часть фрагмента представляет более развитую и универсальную процедуру UpLib. Успешный вызов процедуры UpLib(F, N) обновляет Maple-библиотеку, заданную первым фактическим аргументом F процедурами, таблицами и/или модулями, чьи имена задаются вторым фактическим аргументом N list-типа). Вызов процедуры возвращает NULL-значение с выводом соответствующих сообщений. Процедура обрабатывает основные особые и ошибочные ситуации. Именно она используется нами при практическом обновлении Maple-библиотек [41,42,103,109].

Сохранение Maple-объектов можно производить и по вызову march-функции формата: march('add', <Путь к библиотеке>, <m-файл>, <Имя объекта>)

где третий аргумент определяет m-файл с сохраненным в нем по save-предложению объектом. Например:

> Sr2:= () -> `+`(args)/nargs: save(Sr2, "C:&bsol;Program Files&bsol;Maple 10/Sr2.m");

> march('add', "C:&bsol;Program Files&bsol;Maple 10&bsol;UserLib", "Sr2.m", Sr2);

> march('list', "C:&bsol;Program Files&bsol;Maple 10&bsol;UserLib");

> restart; 3*Sr2(64, 59, 39, 43, 10, 17); ⇒ 116

Последующий вызов процедуры Sr2 после restart-предложения подтверждает корректность выполненной операции обновления UserLib-библиотеки процедурой Sr2. При этом, предполагается, что на этапе 5 созданная UserLib-библиотека была логически сцеплена с главной Maple-библиотекой пакета.

По вызову функции march('delete', <Путь к библиотеке>, <Имя объекта>) производится удаление из библиотеки, определенной вторым аргументом, объекта, указанного третьим аргументом, как это иллюстрирует следующий фрагмент:

> march('delete', "C:&bsol;Program Files&bsol;Maple 10&bsol;UserLib", Ds);

> march('list', "C:&bsol;Program Files&bsol;Maple 10&bsol;UserLib");

[["Sr.m", [2006, 10, 2, 10, 24, 18], 1024, 66], ["M.m", [2006, 10, 2, 16, 15, 15], 1205, 70],

[":-1.m", [2006, 10, 2, 16, 15, 15], 1275, 85]]

Что и подтверждает последующая проверка содержимого библиотеки, отличного от состояния предыдущего фрагмента именно на удаленную процедуру Ds. Объекты из библиотеки удаляются сразу же (точнее информация о них соответствующим образом помечается в индексном файле “Maple.ind”), однако занимаемое ими место не освобождается в файле “Maple.lib” библиотеки. Для освобождения этого места (уплотнения библиотеки) можно использовать вызов функции march('pack', <Путь к библиотеке>). С другими же операциями с библиотеками, поддерживаемыми march-функцией, можно ознакомиться в справке по пакету по ?march. С учетом сказанного это не должно вызвать каких-либо затруднений. В книге [103] и приложенной к ней Библиотеке можно найти много полезных средств по поддержанию работы с библиотеками пользователя, включая процедуры восстановления поврежденных библиотек и работы с библиотеками, организационно отличными от Maple-библиотек.

delres := proc(L::{mla, mlib}, N::symbol, t::{0, 1}) local a b c d f, , , , , W; `if`(Release( ) < 10, NULL, conmlib(L)), assign(d = interface(warnlevel)), interface(warnlevel = 3);

W := (x y, ) → ERROR("%1 deleted means with name of length %2 had been &bsol; ound; correct restoring is difficult enough", nops(x), y);

if t = 0 then march '( delete L N', , ); WARNING("means <%1> has been deleted from library <%2>", N L, ), interface(warnlevel = d)

else if length(N) = 1 then assign(a = [1 0 109, , ], f = cat(L, "&bsol;", `if`(3 < nargs and type(args 4[ ], 'symbol'), args 4[ ], 'maple'), ".ind")) elif length(N) = 2 then assign(a = [1 0 46 109, , , ], f = cat(L, "&bsol;",

`if`(3 < nargs and type(args 4[ ], 'symbol'), args 4[ ], 'maple'), ".ind")) else assign(a = [1, 0, op(convert("" || N[3 .. -1], 'bytes')), 46, 109], f = cat( L, "&bsol;", `if`(3 < nargs and type(args 4[ ], 'symbol'), args 4[ ], 'maple'),

".ind")) end if; assign(b = readbytes ,(f ∞)), close( )f , assign(c = sblist(a b, )); if c = [ ] then interface(warnlevel = d);

error "means with name <%1> does not exist or had been not deleted&bsol; from library <%2>", N L, elif length(N) = 1 then if 1 < nops(c) then interface(warnlevel = d), W(c, 1) else writebytes(f, [op(b[1 .. c[1] − 1]), op(convert("" || ,N 'bytes')), 46, op(b[c[1] + 2 .. -1])]), close( )f

end if;

WARNING(

"access to means <%1> located in library <%2> had been restored",

N L, ), interface(warnlevel = d) elif length(N) = 2 then if 1 < nops( )c then interface(warnlevel = d), W(c, 2)

else writebytes(f, [op(b[1 .. c[1] − 1]), op(convert("" || ,N 'bytes')), op(b[c[1] + 2 .. -1])]), close(f)

end if;

WARNING(

"access to means <%1> located in library <%2> had been restored",

N L, ), interface(warnlevel = d)

else writebytes(f, [op(b[1 .. c[1] − 1]), op(convert("" || N[1 .. 2], 'bytes')), op(b[c[1] + 2 .. -1])]), close( )f ;

WARNING(

"access to means <%1> located in library <%2> had been restored" ,

N, L), interface(warnlevel = d)

end if

end if

end proc

> delres("C:/temp/Userlib", agn, 0);

Warning, means <agn> has been deleted from library <C:/temp/Userlib>

> delres("C:/temp/Userlib", agn, 1); Warning, access to means <agn> located in library <C:/temp/Userlib> had been restored verdel := proc(L::{mlib, mla}, Tab::evaln) local a b c f k h t r i j, , , , , , , , , ;

`if`(Release( ) < 10, NULL, conmlib(L)), assign(f = cat(L, "&bsol;", `if`(3 < nargs and type(args 4[ ], 'symbol'), args 4[ ], 'maple'), ".ind")); assign(h = readbytes ,(f ∞), b = convert([7], 'bytes'), t = [ ]), close( )f ;

for k in [[1, 0, 109], [1, 0, 46, 109]] do assign(' 'c = sblist(k h, )); if c ≠ [ ] then

Tab[nops( )k − 2] := nops( )c ; t := [op( )t , seq(cat(b $ (i = 1 .. nops( )k − 2)), j = 1 .. nops( )c )]; h := parse(Sub_st([cat(convert(k, 'string')[2 .. -2], ",") = ""], convert(h, 'string'), )[1])r

end if

end do; assign(' 'c = sblist [( 1, 0], h)); if c ≠ [ ] then for k in c do a := searchL(h k, , [46 109, ]);

t := [op( )t , cat(b b, , convert(h[k + 2 .. a − 1], 'bytes'))];

Tcounter(Tab, a − k)

end do

end if; map(convert t, , 'symbol')

end proc

> map2(delres, "C:/Temp/UserLib", [MkDir, UpLib, Iddn1, helpman], 0);

Warning, means <MkDir> has been deleted from library <C:/Temp/UserLib>

Warning, means <UpLib> has been deleted from library <C:/Temp/UserLib>

Warning, means <Iddn1> has been deleted from library <C:/Temp/UserLib> Warning, means <helpman> has been deleted from library <C:/Temp/UserLib> > verdel("C:/Temp/UserLib", T);

[••Dir, ••Lib, ••dn1, ••lpman]

При работе с пользовательскими Maple-библиотеками в ряде случаев возникает необходимость восстановления библиотечных средств в случае, когда для их удаления использовалась march-функция. Естественно, восстановление можно выполнять и повторным сохранением удаленных средств. Между тем, в некоторых случаях требуется восстановить удаленное средство, но еще находящееся в файле "maple.lib". В этом случае может оказаться достаточно полезной процедура delres.