process. Компиляция и исполнение строки

^process{строка}
^process[контекст]{строка}
^process[контекст]{строка}[опции]   
[3.1.2]

Строка будет скомпилирована и выполнена как код на Parser в указанном контексте или в текущем контексте. В качестве контекста можно указать объект или класс, но не метод (т. е. если внутри метода будет вызван process, то внутри выполняемого с помощью process кода не будут доступны локальные переменные вызывающего метода).

Этот метод удобно использовать, если какие-то части кода или собственные методы необходимо хранить не в файлах HTML, которые обрабатываются Parser, а в каких-то других или в базе данных.

Также можно указать ряд
опций (хеш):
·$.main[новое имя для метода main, описанного в коде строки]  
·$.file[имя файла, из которого взята данная строка]  
·$.lineno(номер строки в файле, откуда взята данная строка, - может быть отрицательным)  
·$.replace(true|false)  

Внимание: начиная с версии 3.4.3 в случае создания класса с именем, которое уже существует у ранее загруженного или созданного класса, выдается исключение. Вернуть поведение без исключений можно с помощью указания вновь появившейся опции
$.replace(true).

Простые примеры
^process{@extra[]
   Здоровья прежде всего…
}
Метод extra будет добавлен к текущему классу, и его можно будет вызывать в дальнейшем.

^process[$engine:CLASS]{@start[]
   Мотор…
}

Метод
start будет добавлен к пользовательскому классу engine.

$running_man[^man::create[Вася]]
^process[$running_man]{
    
Имя: $name<br />
}

Код будет выполнен в контексте объекта
$running_man, соответственно, может воспользоваться полем name этого объекта, выдаст «Вася».

Оператор include
@include[filename][file]
$file[^
file::load[text;$filename]]
^process[$
caller.self]{^taint[as-is][$file.text]}[
   $.file[$filename]
]

Код загружает указанный файл и выполняет его в контексте объекта или класса, вызвавшего
include. Опция file позволяет указать имя файла, откуда был загружен код. Если возникнет ошибка, будет отображено это «имя файла».

Важно: контекст вызова не включает локальные переменные и параметры вызывающего метода!

Сложный пример
Часто удобно помещать компилируемый код в некоторый метод с именем, вычисляющимся по ходу работы:
# это исходный код, следует обратить внимание, на ^^
$source_code[
2*2=^^eval(2*2)]
# по ходу работы выясняется, что необходимо создать метод с именем method1
$method_name[method1]
# компилируем исходный код, помещаем его в новый метод
^process{$source_code}[
   $.main[$method_name]
]

# далее по коду можно вызывать метод method1
^method1[]

Данный пример будет продолжать работать, даже если в 
$source_code будет определен ряд методов, поскольку опция main задает новое имя методу main.


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