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.


In order to add comments you must register.
Copyright © 1997–2021 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 22.10.2013