Главная Длительная эволюция [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] 7. Выполняются заданные пользователем преобразования, составляющие верхние значения (UpValues) символов-заголовков. Причем в первую очередь выполняются менее общие, а затем более общие определения. 8. Выполняются преобразования, являющиеся встроенными верхними значениями заголовков, в том же порядке, что и в п.7. 9. Применяются правила преобразований, определенные пользователем и составляющие нижние значения (DownValues) заголовков-символов. 10. Если заголовок - не символ, то используются правила преобразований, связанные с заданными пользователем дальними значениями (SubValues) символов, которые являются заголовками заголовков. 11. Используются встроенные правила преобразований, являющиеся нижними значениями вычисленных символов-заголовков. Замечания об общности правил те же, что и раньше. Проиллюстрируем сказанное простейшими примерами: Ь=:2; хЗ + Ь хН-Ь2 Trace {{{6,2}, 2х}, {{6,2}, 22,4}, хЗ-Ь 2х + 4,4-f 2а;-f хЗ) Заголовок Plus вычисляемого выражения и символ х не имеют OwnValues, поэтому, так же как и выражение х*3, они не преобразуются. Поэтому мы не видим следов процесса их вычисления. Фактические вычисления начинаются с элемента 6х, затем вычисляется 62. После этого выполняется сортировка выражения, так как функция Plus обладает атрибутом Orderless. f = Times; f[2,х -- 3] / / Trace {{f,Times}, {х + 3,3 + х}, {2(3+ x)}} Здесь мы видим, что заголовок выражения вычисляется первым, число 2 не преобразуется, выражение x-f-3, имеющее заголовок Plus, подвергается сортировке, а затем элементы вычисляемого выражения соединяются в произведение. f=.; f[x ,y ]:=x-y; f[3 + 2,b + a] Trace {{3 + 2,2 + 3,5}, {6 + a,a + 6}, /[5,a + 6],, 5(+)} Этот пример иллюстрирует, что правила преобразования применяются после вычисления аргументов. Оставим в силе определение, ассоциированное с /, и добавим новое, являющееся верхним значением для символа д: g/:f[g[x ],y ]:=g[x + y] f[g[x + 2],3 + y] Trace {{{х + 2,2 + х},д[2 + х]}, f[g[2 + х], 3 + у], у[2 + х + (3 + у)], {2 + i + (3 + y),2 + i+3 + y,2 + 3 + x + y,5+i + y,y[5 + i + y]}} Clear All[f,g] Здесь хорошо видно, что верхние значения используются раньше, чем нижние. 8.4. Выражения, вычисляемые нестандартно Во многих ситуациях, с некоторыми из которых мы познакомимся ниже, бывает необходимо изменить стандартный порядок вычисления выражений. Применение самого крайнего средства: вообще не вычислять введенного выражения - обеспечивает функция Hold. f[l + l,x + 2] /[2,2 + х] Hold[f[l + l,x + 2]] Я0ВД1+1,1 + 2]] Функция HoldForm аналогична по действию функции Hold, но в отличие от последней она не воспроизводится в выходной ячейке. HoldForm[f [1 +1, X + 2]] /[1 + 1,1 + 2] Функция ReleaseHold устраняет заголовки Hold и HoldForm, поэтому после ее применения выражение - аргумент последних функций вычисляется. ReleaseHold[%] /[2,2 + 1] Общим механизмом, позволяющим изменить стандартный процесс вычислений, является наличие специальных атрибутов HoldAll, HoldFirst и HoldRest. Эти атрибуты блокируют вычисление соответственно всех непосредственных подвыражений, первого непосредственного подвыражения или всех непосредственных подвыражений, кроме первого у выражения, заголовок которого имеет рах;сматриваемые атрибуты. Функции Hold и HoldForm имеют атрибут HoldAll. Attributes[f] = HoldFirst f[l + l,x + 2] /[1 + 1,2 + 1] Атрибут HoldFirst имеют многие встроенные функции, например Set. Attributes[Set] {HoldFirst, Protected} f :=a; g := b f = g Trace {{5,6},/= 6,6} [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.0013 |