Главная  Длительная эволюция 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [ 67 ] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

f[argl,arg2,...] не будет вычисляться ожидаемым образом. Поправить положение можно с помощью функции Remove. После вычисления выражения Remove[f] символ Globalf будет полностью удален, останется лишь NewContextf.

9.3. Подгрузка программ

Программы вызываются при помощи команды Get ["name"] или Needs["name"], где пате есть контекст программы. Иная форма команды Get["name"] есть << пате. Разница между командами состоит в том, что Get не проверяет, имеется ли контекст программы на контекстной дорожке, а Needs проверяет, и при наличии контекста повторной подгрузки не происходит. Поэтому команду Needs целесообразно использовать в тех случаях, когда в течение сессии неоднократно подгружались какие-то пакеты. Команда Needs читает значение глобальной переменной $Packages, которая представляет собой список контекстов вызванных программ. Значение этой глобальной переменной изменяется командой BeginPackage. Рассмотренные команды сначала ищут файлы с расширением т, в которых хранятся программы. Имеются определенные правила соответствия имен файлов с программами и контекстов программ, зависящие от компьютерной платформы. Для РС-компьютеров название файла без расширения должно содержать не более восьми букв, а контекст программы не должен удовлетворять этому требованию. Поэтому название файла совпадает с первыми восемью буквами контекста с тем исключением, что в контекст могут входить заглавные буквы, которые перейдут в строчные в имени файла. Если контекст программы состоит из контекста и подконтекста, то первые восемь букв контекста составят название директории. Так, программа с контекстом AlgebraCountRoots хранится в файле countroo.m в директории Algebra, поэтому эта программа будет читаться из файла Algebra\countroo.m.



Рассмотрим в качестве примера, что происходит с контекстами и контекстной дорожкой при подгрузке программы с контекстом AlgebraCountRoots - первой программы в первой поддиректории Algebra директории Packages. Допустим, что контекстная дорожка в настоящий момент имеет вид {Global, System}.

« AlgebraCountRoots

После выполнения команды

BeginPackage[" AlgebraCountRoots"]

текущим контекстом становится строка AlgebraCountRoots, а контекстная дорожка принимает вид {AlgebraCountRoots, System}. После рассматриваемой команды в программе идет название вместе с информацией о единственной экспортируемой функции: CountRoots:: usage = "..следовательно, символ CountRoots получит контекстную приставку AlgebraCountRoots, так как нет встроенной функции с тем же заголовком. Таким образом полное имя заголовка будет AlgebraCountRootsCountRoots. Далее выполняется команда

Begin["AlgebraCountRootsPrivate"]

(ее аргументом могла бы быть строка "Private"), устанавливающая текущий контекст AlgebraCountRootsPrivate, но оставляющая контекстную дорожку {AlgebraCountRoots, System} неизменной. После этой команды следует Count-Roots:: npoly -"...", являющаяся сообщением об ошибке в случае, если пользователь вместо полинома ввел в качестве аргумента функции CountRoots другой объект. Поскольку символ CountRoots уже получил контекстную приставку AlgebraCountRoots и поскольку контекст AlgebraCountRoots



находится на контекстной дорожке, символ CountRoots остается с присвоенной ранее контекстной приставкой. Сказанное остается верным относительно этого символа, участвующего в определении

CountRoots[x- ] := With[{result = CountRootsO[x]}, result/; result =! = SFailed]

В то же время символы result и CountRootsO получают контекстную приставку AlgebraCountRootsPrivate, а символы With и $Failed остаются с контекстной приставкой System. Аналогично символы OmitZeroes и Select, находящиеся в следующем определении, получают приставки AlgebraCountRootsPrivate и System соответственно. Псь следние в программе четыре заголовка функций countroots получают контекстную приставку AlgebraCountRootsPrivate. Далее следует команда End[], после выполнения которой контекстная дорожка не изменяется, а текущим контекстом становится AlgebraCountRoots. За рассматриваемой командой происходит протектирование функции CountRoots, и, наконец, команда EndPackage[] делает текущим контекстом Global, а контекстную дорожку равной {AlgebraCountRoots, Global, System}. Нелишне добавить, что при чтении программы определения выполняются, поэтому после подгрузки программы соответствующие глобальные правила будут исполняться ядром „Математики".

Команда BeginPackage имеет опциональные аргументы. Их нужно указывать, если в программе используются не только встроенные функции, но также и функции стандартных пакетов или других программ пользователя. Контексты этих программ и указываются в качестве второго и т.д. аргументов функции BeginPackage, которая устанавливает их вместе со своим контекстом на контекстной дорожке. Программы, необходимые для работы подгружаемой программы, называются импортируемыми. Эти программы вызываются неяв-



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [ 67 ] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

0.0009