{+|+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:\Program Files\Maple 10\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:\Program Files\Maple 10\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], {":/" ":\", }) 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(( "\", 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:\program files\Maple 10\UserLib". По вызову процедуры uplib("C:\Program Files\Maple 10\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:\Program Files\Maple 10/Sr2.m");
> march('add', "C:\Program Files\Maple 10\UserLib", "Sr2.m", Sr2);
> march('list', "C:\Program Files\Maple 10\UserLib");
> restart; 3*Sr2(64, 59, 39, 43, 10, 17); ⇒ 116
Последующий вызов процедуры Sr2 после restart-предложения подтверждает корректность выполненной операции обновления UserLib-библиотеки процедурой Sr2. При этом, предполагается, что на этапе 5 созданная UserLib-библиотека была логически сцеплена с главной Maple-библиотекой пакета.
По вызову функции march('delete', <Путь к библиотеке>, <Имя объекта>) производится удаление из библиотеки, определенной вторым аргументом, объекта, указанного третьим аргументом, как это иллюстрирует следующий фрагмент:
> march('delete', "C:\Program Files\Maple 10\UserLib", Ds);
> march('list', "C:\Program Files\Maple 10\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 \ 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, "\", `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, "\", `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, "\", `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\ 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, "\", `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.