今日、入れ子になった簡略関数を使用して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
%は内部関数に属していることがわかります。欠点は、外部関数の%にアクセスできなくなることです。
使用 fn [x]
構文。
それは完全に任意です。パーサーには明示的に無効にする行が2行あります。その行を編集すると、ネストされた匿名関数を持つことができ、期待どおりに動作します。
具体的には https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.Java の634-635行目
public static class FnReader extends AFn{
public Object invoke(Object reader, Object lparen) {
PushbackReader r = (PushbackReader) reader;
if(ARG_ENV.deref() != null) // <-- line 634
throw new IllegalStateException("Nested #()s are not allowed");
// ...
(fn [params](body))ソートの匿名関数をネストすることができます。 #構文のみがネストをサポートしていません。