Ответ
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 — для кода.
- Поведение is junction, G_Z [M] 24.10.2015 04:11
- Ответ, MoKo 24.10.2015 20:47
- Ну так мы про это и говорим..., Sumo [M] 24.10.2015 21:57
- Ответ, G_Z [M] 24.10.2015 20:58
- Ответ, MoKo 25.10.2015 02:41
- Ответ, G_Z [M] 25.10.2015 02:55 / 25.10.2015 02:59
- Ответ, MoKo 25.10.2015 03:29
- Ответ, G_Z [M] 25.10.2015 03:33
- Ответ, MoKo 25.10.2015 13:15
- Ответ, G_Z [M] 25.10.2015 14:15
- Ответ, MoKo 25.10.2015 14:26
- Ответ, MoKo 25.10.2015 14:45
- Ответ, G_Z [M] 25.10.2015 15:05
- Ответ, MoKo 26.10.2015 02:55
- Ответ, G_Z [M] 26.10.2015 03:11
- Я понимаю, G_Z [M] 25.10.2015 14:31 / 25.10.2015 14:33
- Ответ, MoKo 25.10.2015 03:03
- Ответ, G_Z [M] 25.10.2015 03:17
- Ответ, MoKo 25.10.2015 03:24
- Есть одна ситуация..., Sumo [M] 24.10.2015 11:30 / 24.10.2015 11:31
- У «кода» другая семантика..., Sumo [M] 24.10.2015 10:37 / 24.10.2015 10:42
- Ответ, G_Z [M] 24.10.2015 16:13 / 24.10.2015 16:17
- Ответ, Sumo [M] 24.10.2015 17:09