Сегодня я попытался оценить выражение Clojure с помощью вложенных сокращенных функций, и оно мне не дало.
Выражение было:
(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed
Выход был:
IllegalStateException Nested #()s are not allowed clojure.lang.LispReader$FnReader.invoke (LispReader.java:630)
...and a bunch of other garbage
functional-programming
syntax
clojure
functions
Линкольн Берджесон
источник
источник
Ответы:
Вы бы знали, что% принадлежит внутренней функции. Недостатком является то, что вы потеряете доступ к% во внешней функции.
fn [x]
Вместо этого используйте синтаксис.источник
%
внешнему интерфейсу, и в те времена, когда вы это делали, вы могли отступить(fn)
, верно?Это совершенно произвольно; в парсере есть пара строк, которые явно отключают его. Если вы отредактируете эту строку, вы можете иметь вложенные анонимные функции, и они будут действовать точно так, как вы ожидаете.
в частности, строки 634-635 в https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java
источник
fn [x]
переписывание кода OP будет иметь такую же функциональность, что и модифицированная версия clojure. Кроме того, возникнет ли проблема с переносимостью кода clojure?Вы можете иметь вложенные анонимные функции вида (fn [params] (body)). Только синтаксис # не поддерживает вложенность.
источник