Использование процедур
В основе процедурного программирования лежит понятие процедуры и типовых средств управления – циклов, условных и безусловных выражений и т. д. Процедурный подход – самый распространенный в программировании, и разработчики Mathematica были вынуждены обеспечить его полную поддержку. Однако программирование систем Mathematica и в этом случае остается функциональным, поскольку элементы процедурного программирования существуют в конечном счете в виде функций.
Процедуры являются полностью самостоятельными программными модулями, которые задаются своими именами и отождествляются с выполнением некоторой последовательности операций. Они могут быть заданы в одной строке с использованием в качестве разделителя символа ";" (точка с запятой). Вот пример задания однострочной процедуры, отождествленной с именем г:
r
=
(
1
+
x)
^
2
; r
=
Expand[r]; r
-
1
2X
+
X2
Обратите внимание на то, что в теле процедуры символ г используется как вспомогательная переменная. Эта процедура возвращает символьное выражение:
Expand[(
1
+
x)
^
2
]
-
1
В общем случае в теле процедуры могут находиться произвольные выражения, разумеется, с синтаксисом, присущим языку программирования системы. Процедура может не возвращать никаких значений, а просто выполнять определенный комплекс операций. Область записи подобных элементарных процедур ограничена ячейкой (строкой) ввода.
Для задания процедуры со списком локальных переменных {а, b,…} и телом ргос может использоваться функция Module [ {а, b,…},ргос]. С применением этой функции мы столкнемся позже.
Для создания полноценных процедур и функций, которые могут располагаться в любом числе строк, может использоваться базовая структура – блок:
- Block [{x, у,…}, procedure] – задание процедуры с декларацией списка локальных переменных х, у,…;
- Block[{x = х0, у=у0,…}, procedure] – задание процедуры с декларацией списка переменных х, у,… с заданными начальными значениями.
Пример использования базовой структуры:
g[x_]:
=
Block[{u}, u
=
(
1
+
x)
^
2
; u
=
Expand[u] ] g[a
+
b]
1
+
2a
+
a2
+
2b
+
2ab
+
b2
u
u
u
=
123456
; g[
2
]
9
u
123456
Обратите внимание: последние действия показывают, что переменная и, введенная в тело базовой структуры, является действительно локальной переменной, и присвоение ей символьного выражения (1 + х) ^ 2 в теле блока игнорируется вне этого блока. Если переменная и до применения в функции была не определена, то она так и остается неопределенной. А если она имела до этого некоторое значение (в нашем случае – 123 456), то и по выходе из процедуры она будет иметь это значение.