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

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