junction (класс)

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

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

- при присваивании ей кода:
$junction{Код, присваиваемый переменной: ^do_something[]}

- при передаче кода параметром:
@somewhere[]
^method{
Код, передаваемый параметром: ^do_something_else[]}

@method[parameter]
#здесь в $parameter придет junction

- при обращении к имени метода класса:
$action[$user:edit]
#$action[$user:delete]
^action[параметр]

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

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

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

Пример junction-выражений и кода
@possible_reminder[age;have_passport]
^myif($age>=16 && !$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 будет вызван, только если определен.


Copyright © 1997–2024 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 25.09.2024