Определяемые пользователем методы и операторы

@имя[параметры]
тело

@имя[параметры][локальные;переменные]

тело

@static:имя[параметры]
   
[3.4.1]
тело метода класса, который может быть вызван только статически (подробности)


@имя[*параметры]   
[3.4.1]
тело

@имя[параметр1;параметр2;*параметры]   
[3.4.1]
тело

@имя[параметр1;.именованный_параметр1;.именованный_параметр2[;...]]   
[3.5.0]
тело

Метод - это блок кода, имеющий имя, принимающий параметры и возвращающий результат. Имена параметров метода перечисляются через точку с запятой. Метод также может иметь локальные переменные, которые необходимо объявить в заголовке метода, после объявления параметров. Имена переменных разделяются точкой с запятой.

Локальные переменные видны в пределах оператора или метода, а также изнутри вызываемых ими операторов и методов, см. ниже
$caller.

При описании метода можно пользоваться не только параметрами или локальными переменными, а также любыми другими именами, при этом работа будет вестись с полями класса или полями объекта, в зависимости от того, как был вызван определенный разработчиком метод - статически или динамически.

В Parser возможно расширить базовый набор операторов, операторами в Parser считаются методы класса MAIN.

Важно: операторы - это методы класса
MAIN, но, в отличие от методов других классов, их можно вызвать из любого класса просто по имени, т. е. можно писать
^include[…] вместо громоздкого ^MAIN:include[…].

В методах, которые могут принимать произвольное число параметров, все «лишние» параметры доступны в виде хеша с числовыми ключами. Ключ 0 соответствует первому «лишнему» параметру.


В методах, которые могут принимать именованные параметры, все такие параметры передаются в виде хэша последним параметром. Именованные параметры инициализируются значениями соответствующих ключей этого хэша. Допускается не указывать значения отдельных параметров или не передавать хэш вовсе; в таком случае значения параметров будут считаться void.

Пример
@main[]
call: ^call[a;b;c]
named: ^named[a; $.o2[value] ]

@call[p;*args][k;v]
p=$p
^args.foreach[k;v]{
$k=$v}[^#0A]

@named[p;.o1;.o2][k;v]
p=$p
o1=$o1
o2=$o2

Выведет:
call: p=a
0=b
1=c


named: p=a
o1=
o2=value



Системная переменная: 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 вовсе.   
[3.4.0]

Системная переменная: result, явное определение   [3.4.5]
Если в методе явно объявить локальную переменную result, это укажет Parser, что нужно проигнорировать все пробельные символы в коде (фигурных скобках).

Пример
@lookup[table;findcol;findvalue][result]
^if(^
table.locate[$findcol;$findvalue]){
   $yes[yes found] $yes
}{
   not found
}

Здесь посетителю будет выдано либо значение
yes found, либо значение not found.

Важно: в приведенном примере не будет выдано ни одного символа перевода строки, пробела или табуляции, написанных в коде.

Важно: до версии
3.4.5 попытка написать
not found текстом прямо в теле метода приведет к ошибке.


Системная переменная: caller
Все методы и операторы имеют локальную переменную caller, которая хранит «контекст вызова» метода или оператора.

Через нее можно:
·считать переменную - $caller.считать или записать переменную - $caller.записать[значение], как будто мы находимся в том месте, откуда вызвали описываемый метод или оператор;  
·узнать, кто вызвал описываемый метод или оператор, обратившись к $caller.self и к $caller.method   [3.4.5];  
·узнать имя вызывающего, обратившись к  $caller.method.name   [3.4.5].  

Например, нам нужен оператор, похожий на системный
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.



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