Mathematica/Описание языка

Материал из Викиучебника — открытых книг для открытого мира

Язык программирования Mathematica[править]

Кроме того, Mathematica это интерпретируемый язык функционального программирования. Mathematica допускает отложенные вычисления с помощью оператора определения «:=».

Можно сказать, что система Mathematica написана на языке Mathematica, хотя некоторые функции, особенно относящиеся к линейной алгебре, в целях оптимизации были написаны на языке C.

Функциональное программирование[править]

Пример кода, который последовательно 5 раз применяет функцию f:

NestList[f, x, 5]

Результатом будет список из аргумента x, одного, двух, трёх и так далее до пяти применений функции f к этому аргументу, всего 6 элементов списка:

{x, f[x], f[f[x]], f[f[f[x]]], f[f[f[f[x]]]], f[f[f[f[f[x]]]]]}

Пример 3-х кратного применения конкретной функции Sin[x + 1] имеет вид:

NestList[Sin[# + 1] &, x, 3]

Результатом будет:

{x, Sin[1 + x], Sin[1 + Sin[1 + x]], Sin[1 + Sin[1 + Sin[1 + x]]]}

Процедурное программирование[править]

Mathematica также поддерживает процедурный стиль программирования:

For[i = 1; t = x, i^2 < 10, i++,
t = t^2 + i;
Print[t]]

Точка с запятой отделяет различные последовательные команды. Для осуществления стандартных циклов есть функции Do, While, For. Условные выражения осуществляются посредством функций If, Which, Switch. Таким образом, будучи изначально функциональным языком программирование Mathematica, тем не менее, имеет функции, которые позволяют писать код очень близкий к стандартным процедурным языкам программирования.

Программирование посредством задания правил[править]

В системе Mathematica также можно задавать правила работы с теми или иными выражениями. Таким образом, можно определять объекты подобно тому как это обычно делается в математике, задавая их свойства посредством правил:

f[x_ + y_] := f[x] + f[y];
f[a + b + c]

Результат:

f[a] + f[b] + f[c]

Объектно-ориентированное программирование[править]

Mathematica позволяет и явно задавать определения, связанные с определённым объектом, реализуя тем самым возможность использования объектно-ориентированного стиля программирования:

h /: f[h[x_], x_] := hf[x];
h /: p_[h[x_]] := ph[f, x];
h /: h[x_] + h[y_] := hsum[x, y];

Вычисляя (с данными определениями):

h[a] + h[b] + p[h[r]] + h[h[x]]

результатом будет:

hsum[a, b] + ph[f, r] + ph[f, x]