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

[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]

ПО его краткому имени можно получить только в том случае, когда его контекст помещен на контекстную дорожку.

Существование нескольких полных символов с одним и тем же кратким порождает явление так называемого „затенения" одного полного символа другим: символ с контекстной приставкой, расположенной на контекстной дорожке левее приставки символа с тем же кратким именем, затеняет последний. „Математика" всегда предупреждает о возможности затенения.

Globalz

Globalг.: shdvj-.

Warning: Symbol z appears in multiple contexts {Global,a; definitions in context Global may shadow or be shadowed by other definitions

9.2. Контексты и программы

Механизм контекстов используется для того, чтобы хранящиеся в отдельном файле написанные пользователем определения основных и вспомогательных функций, т.е. разработанные пользователем программы, вводить в Записные книжки. Файл с такой программой в Версии 2.x должен иметь расширение тп. Основные функции, ради которых и была написана программа, называются экспортируемыми. Программа начинается с команды

BeginPackage[" NewCont ext" ]

где NewContext - контекстная приставка, которой будут снабжены экспортируемые функции. Как правило, название вводимого контекста должно быть связано с областью приложения экспортируемых функций и быть по возможности уникальным, т.е. не совпадать ни с одним из известных. Хорошим примером могут служит стандартные пакеты „Математики".



В них все графические функции имеют контекст, начинающийся с Graphics, функции для выполнения операций математического анализа имеют контекстную приставку, начинающуюся с Calculus, и т.д. Кроме того, возможно употребление под-контекстов: CalculusPade. Команда Begii\Package изменяет контекстную дорожку и устанавливает текущий контекст равным NewContext. После ее выполнения контекстная дорожка, какова бы она ни была ранее, принимает вид:

{NewContext, System}

Теперь любой вводимый символ, не являющийся встроенным, получает контекстную приставку NewContext. После команды BeginPackage следуют заголовки экспортируемых функций, сопровождаемые информацией о назначении каждой функции. Оформляется такая информация в следующем виде:

MyFirstFunction:: usage = "MyFirstFunction does something..."

Здесь MyFirstFunction - заголовок первой экспортируемой функции, а строка содержит информацию, которую можно после подгрузки программы получить стандартным способом, напечатав ?MyFirstFunction (естественно, слова does something следует заменить на более содержательные).

После заголовков экспортируемых функций следует команда

Beginp"Private"]

Следует обратить внимание на то, что слово Private окаймлено с двух сторон знаками открытия цитаты. Эта команда, не меняя контекстноИ дорожки, устанавливает новый текущий контекст равным NewContextPrivate. После выполнения команды все ранее не встречавшиеся символы получат контекстную приставку NewContextPrivate, означающую, что



они находятся в подконтексте контекста NewContexf. Слово Private вполне можно заменить на любое другое, но такова традиция. После команды Begin["Private"] располагаются определения функций, т.е. сама программа. Затем следует команда

End[]

восстанавливающая имевшийся до Begin[" Private"] контекст, т.е. контекст NewContext\ и далее команда

EndPackage[]

после которой восстанавливается имевшийся до подгрузки программы текущий контекст (например. Global), а контекст NewContext помещается в начало прежней контекстной дорожки.

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

Явление затенения часто возникает в случаях, когда пользователь напечатал заголовок экспортируемой функции, скажем, f до подгрузки программы. Тогда символ / получит контекстную приставку текущего контекста, например Global, и символ Global/ затенит символ NewContextf в.том смысле, что впечатывание краткого имени / будет подразумевать Global/. Но с последним символом не связаны определения экспортируемой функции NewContextf, поэтому выражение



[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.001