web-dev-qa-db-ja.com

Clojureでネストされた省略形関数を作成できないのはなぜですか?

今日、入れ子になった簡略関数を使用して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
11

%は内部関数に属していることがわかります。欠点は、外部関数の%にアクセスできなくなることです。

使用 fn [x]構文。

5
Robert Harvey

それは完全に任意です。パーサーには明示的に無効にする行が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");
        // ...
10
amara

(fn [params](body))ソートの匿名関数をネストすることができます。 #構文のみがネストをサポートしていません。

3
WolfeFan