Класс junction

Предназначен для хранения кода и контекста его выполнения.

При обращении к переменным, хранящим в себе junction, Parser выполняет код в сохраненном контексте.

Значение типа junction появляется в переменной

  1. при присваивании ей кода:
$junction{Код, присваиваемый переменной: ^do_something[]}
  1. при передаче кода параметром:
@somewhere[]
^method{Код, передаваемый параметром: ^do_something_else[]}
…
@method[parameter]
#здесь в $parameter придет junction
  1. при обращении к имени метода класса:
$action[$user:edit]
#$action[$user:delete]
^action[параметр]

здесь $action хранит ссылку на метод и его класс, вызов action теперь аналогичен вызову ^edit[параметр];

  1. при обращении к имени метода объекта:
$action[$person.show_info]
^action[full]

здесь $action хранит ссылку на метод и его объект, вызов action теперь аналогичен вызову ^person.show_info[параметры].

Пример junction-выражений и кода

@possible_reminder[age;have_passport]
^myif($age >= 14 && !$have_passport){
	Тебе уже $age лет, пора сходить в паспортный стол.
}

@myif[condition;action][age]
$age(11)

^if($condition){
	$action
}
Параметр с выражением — это код, вычисляющий выражение, он выполняется — вычисляется выражение — при каждом обращении к параметру внутри вызова.

Здесь оператору myif передан код, печатающий, среди прочего, $age. Выполнение проверки и кода оператор производит в сохраненном (внутри $condition и $action) контексте, поэтому наличие в myif локальной переменной age и ее значение никак не влияют на то, что будет проверено и что напечатано.

Пример проверки наличия метода

^if($some_method is junction){
	^some_method[параметр]
}{
	нет метода
}

Метод some_method будет вызван, только если определен.