Оператор блока
Оператор блока
Блок (block) - это, формально говоря, описание отложенной последовательности действий. Иными словами, блок-сообщение – это группа сообщений, заключенная в квадратные скобки. Блок – объект специального вида (экземпляр класса Context (Контекст)), вычисление которого (т.е. выполнение списка внутренних операторов) производится путем посылки к нему сообщения - value (значение). Если оператор блока находится внутри программы, то создается автоматически экземпляр класса Context, и в нем накапливается вся необходимая информация для работы блока, однако оценка содержимого оператора блока при этом не выполняется. Чтобы она выполнялась, экземпляру класса Context и посылается сообщение value.
Например:
| x |
x := [ 'строка' inPos: 5 ]
^x. -- результат - экзКонтекст
Заменив последнюю строку на: ^x value, получим результат "к".
Блок может иметь аргументы. В этом случае сообщение для его вычисления будет ключевым:
[ :<аргумент>| <сообщения> ] value: <значение аргумента>
Например:
^[:i | i+5] value: 5 -- 10
^[:i :j| i*j ] value:5 value: 3 -- 15
Аргументы блока описываются в начале блока (а не в начале программы как все остальные переменные). Символ '|' в данном случае - это символ окончания декларации параметров блока.
Например:
[ :i :j | i + j ]
i , j - параметры блока
| - символ окончания декларации параметров
i + j - "тело" блока
Аргумент блока (block argument) - это параметр, поставляемый при выполнении конкретного блока.
Например:
[:i | i+5 ] value:15 -- i - аргумент блока, принимающий значение 15