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

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

Глава 9

РАЗРАБОТКА ПРОГРАММ

Материал предшествующих глав позволяет читателю вести замкнутое „натуральное хозяйство" в пределах одной отдельно взятой Записной книжки, т.е. проводить вычисления и графические построения, пользуясь встроенными функциями, функциями из подгружаемых стандартных пакетов и самостоятельно определенными функциями. Если последних становится много или они представляют собой многострочные совокупности определений, то возникает необходимость их сохранять и вызывать точно так же, как вызываются функции пакетов, являющихся неотъемлемой частью „Математики". Основное требование, которому должны удовлетворять такие пакеты - отсутствие конфликта импортируемых функций, констант и переменных с введенными ранее в текущей сессии. Это требование становится еще более существенным, если иметь в виду дальнейший обмен программами с коллегами или их коммерческое распространение. Совершенно невозможно предвидеть, какие определения будущий пользователь вашей программы успел связать, скажем, с символом /, являющимся в вашей программе заголовком основной или вспомогательной функции. Отсутствие подобных конфликтов при подгрузке стандартных пакетов позволяет предположить, что разработчики „Математики" нашли или использовали эффективный метод решения рассматриваемой задачи.

9.1. Контексты

Если пользователь однажды ввел с клавиатуры какой-либо символ, то „Математика" будет рассматривать его как определен-



ный „глобально", т.е. как относящийся всюду в дальнейшем к одному и тому же объекту. Это позволяет связывать с символом различные определения, являющиеся основным механизмом символьных преобразований. Однако такое положение дел не совсем удобно, так как сколько-нибудь длительная работа требовала бы изощренной изобретательности в придумывании различных символов. Существует также определенная математическая и программистская традиция, следуя которой переменные итераторов обозначают г, j и т.п. Кроме того, часто возникает необходимость вводить вспомогательные переменные для обозначения промежуточных результатов. Все это объясняет существование механизмов локализации символов в определенных границах. Простейший такой механизм - механизм локализации значений итераторов в функциях Do, Sum и др.

i = 5; Sum[x-i,{i,l,3}] х + х + х

Несмотря на то что при вычислении суммы переменной г итератора в последний раз было присвоено значение 3, символ г сохраняет ранее присвоенное значение 5. Механизм лока лизации значений переменных в итераторах не препятствует конфликту символов. Рассмотрим простейший пример такого конфликта. Определим функцию, вычисляющую символьную сумму первых трех натуральных степеней своего аргумента.

f[x ]:=Sum[x-i,{i,3}]

{f[y], f[i]}

{У + У4у\ 32}

Второй результат довольно неожиданный, но если принять во внимание, что в этом случае функция iSum вычисляет сумму выражений вида г""!, он становится понятным.



Избежать подобного „захватывания" итератором глобального символа позволяет функция Module. В данном примере определение

Clear[f]; f[x ] := Module[{i},Sum[x-i,{i,3}]]

позволяет избежать захватывания:

{f[y], f[i]}

{у + у-у г + +

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

f[y ] := Module[{i},Sum[y-i, {i,4}]] f[u]

u + u + u

Мы смогли увидеть, что работает старое определение. Но как быть, если новое есть определение промежуточной функции, спрятанное среди других объектов в какой-то программе?

Механизм контекстов есть более совершенный механизм, позволяющий существенно ограничить конфликт символов. С чисто технической точки зрения контекст - это приставка к имени символа вида Something, где Something является именем контекста. Любой символ всегда имеет непустую контекстную приставку. Правда, как правило, она остается „за кадром", не участвуя в представлении символа на экране дисплея. Следовательно, могут существовать разные символы, одинаково представляемые на экране. В этом смысле контекст играет роль директории (папки): ведь разные файлы с одним и тем же именем вполне могут сосуществовать, находясь в разных директориях. Узнать контекстную приставку символа



[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