Определяемые пользователем методы и операторы
@имя[параметры]
тело
@имя[параметры][локальные;переменные]
тело
@static:имя[параметры] [3.4.1]
тело метода класса, который может быть вызван только статически (подробности)
@имя[*параметры] [3.4.1]
тело
@имя[параметр1;параметр2;*параметры] [3.4.1]
тело
Метод, это блок кода, имеющий имя, принимающий параметры, и возвращающий результат. Имена параметров метода перечисляются через точку с запятой. Метод также может иметь локальные переменные, которые необходимо объявить в заголовке метода, после объявления параметров, имена разделяются точкой с запятой.
Локальные переменные видны в пределах оператора или метода, и изнутри вызываемых ими операторов и методов, см. ниже $caller.
При описании метода можно пользоваться не только параметрами или локальными переменными, а также любыми другими именами, при этом вы будете работать с полями класса, или полями объекта, в зависимости от того, как был вызван определенный вами метод, статически, или динамически.
В Parser вы можете расширить базовый набор операторов, операторами в Parser считаются методы класса MAIN.
Важно: операторы, это методы класса MAIN, но в отличие от методов других классов, их можно вызвать из любого класса просто по имени, т.е. можно писать ^include[…], вместо громоздкого ^MAIN:include[…].
В методах, которые могут принимать произвольное число параметров все «лишние параметры» доступны в виде хеша с числовыми ключами.
Пример:
@main[]
^call[a;b;c]
@call[p;*args][k;v]
p=$p
^args.foreach[k;v]{
$k=$v
}[^#0A]
Выведет:
p=a
0=b
1=c
Системная переменная: self
Все методы и операторы имеют локальную переменную self, она хранит ссылку на текущий объект, в статических методах хранит то же, что и $CLASS.
Пример:
@main[]
$a[Статическое поле ^$a класса MAIN]
^test[Параметр метода]
@test[a]
^$a - $a <br />
^$self.a - $self.a
Выведет:
$a - Параметр метода
$self.a - Статическое поле $a класса MAIN
Системная переменная: result
Все методы и операторы имеют локальную переменную result. Если ей присвоить какое-то значение, то именно оно будет результатом выполнения метода. Значение переменной result можно считывать и использовать в вычислениях.
Пример:
@main[]
$a(2)
$b(3)
$summa[^sum[$a;$b]]
$summa
@sum[a;b]
^eval($a+$b)
$result[Ничего не скажу!]
Здесь клиенту будет выдана строка Ничего не скажу!, а не результат сложения двух чисел.
Системная переменная: result, явное определение Если в методе явно объявить локальную переменную result, это укажет Parser, что нужно проигнорировать все пробельные символы и считать ошибочными любые не пробельные символы, если их явно не присваивают переменной result.
Пример:
@lookup[table;findcol;resultcol;findvalue;notfound][result]
^if(^table.locate[$findcol;$findvalue]){
$table.$resultcol
}{
$notfound
}
Здесь клиенту будет выдано либо значение из колонки $resultcol, либо значение $notfound.
Важно: в приведенном примере не будет выдано ни одного символа перевода строки, пробела или табуляции.
Важно: попытка заменить $notfound текстом, написанным прямо в теле метода, приведен к ошибке. Чтобы Parser не воспринимал написанные в теле метода не пробельные символы как ошибку их нужно явно присваивать переменной result.
Системная переменная: caller
Все методы и операторы имеют локальную переменную caller, которая хранит «контекст вызова» метода или оператора.
Через нее можно:
· | узнать, кто вызвал вызвавший описываемый метод или оператор, обратившись к $caller.self;
|
· | считать - $caller.считать, или записать - $caller.записать[значение] переменную, как будто вы находитесь в том месте, откуда вызвали описываемый метод или оператор.
|
Например вам нужен оператор, похожий на системный for, но чем-то отличающийся от него. Вы можете написать его сами, воспользовавшись возможностью менять локальную переменную с именем, переданным вам, в контексте вызова вашего оператора.
@steppedfor[name;from;to;step;code]
$caller.$name($from)
^while($caller.$name<=$to){
$code
^caller.$name.inc($step)
}
Теперь такой вызов…
@somewhere[][i]
^steppedfor[i](1;10;2){$i }
…напечатает «1 3 5 7 9 », обратите внимание, что изменяется локальная переменная метода somewhere.
Примечание: возможность узнать контекст вызова удобна для задания контекста компиляции кода (см. «process. Компиляция и исполнение строки».
Системная переменная: locals, явное определение [3.3.0]
Если в методе явно объявить локальную переменную locals, это будет равносильно объявлению всех переменных, используемых в нем локальными.
Для обращения к переменных класса или объекта в этом случае необходимо использовать self.