parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

G_Z 24.10.2015 16:13 / 24.10.2015 16:17

Из этого следует, что при проверке переменной с кодом на тип (is) сначала должно быть вычислено значение, а потом уже взят тип этого значения.
Не совсем согласен.
Логика в этом есть, но это сродни проверке возвращаемого методом значения — когда передана ссылка на метод — вместо проверки переданной ссылки.
Если сделать как ты предлагаешь, то мы можем получить фигню:
@func[value]
# Функция ожидает число или строку
^if($value is double){
^value.format[%08d]
}{
$value
}
Функция странная, ей может прийти int, который она не отформатирует или число в виде строки, которое тоже будет пропущено мимо.
Проверки должны быть хитрее и полагаться только на проверку типа нельзя.
# А мы вызываем ее с кодом
^func{^eval(2+3)}
Вызов с круглыми скобками, кстати, тоже junction:
^func(2 + 3)
Я бы предпочел переименовать is junction в is function, чтобы избежать проблемы с терминами и не требовалось объяснять почему проверка на junction-code не имеет смысла.
Можно, конечно, и новый тип проверки сделать.
Но и привести к единообразию текущую можно:
1. is junction никогда не вызывает срабатывания;
2. чтобы узнать тип возвращаемого значения к junction (вне зависимости ссылка это или код) нужно явно обратиться и получить значение.

Считаю, что так более логично, но это вполне может быть несовместимостью.
Твои примеры имеют право на жизнь и могут встречаться в живом коде.
Я бы сделал аннотацию у параметров:
@myfor[var;from;to;code:code;separator]
# Если в code пришел не код, то Парсер вывалит исключение «параметр code должен быть кодом».
Если давать пользователю проверять, то сделать другой синтаксис:
@myfor[var;from;to;code;separator]
^if($code has code){...}
^if(^reflection:argument_has_code[code]){...}
Этот подход мне нравится меньше, потому что позволит писать функции, которые зависят от типа вызова.
Кстати, а separator тоже может быть кодом, а может не быть.
По аналогии с оным у menu и foreach.

Это совершенно логично, а проверить такую ситуацию сейчас невозможно.
И с декларацией code: тоже невозможно, только с отдельным типом проверки, тем же «has code».


Самое совместимое, пожалуй, is junction — ссылки на методы, отдельный тип is code — для кода.