Ich habe heute versucht, einen Clojure-Ausdruck mit verschachtelten Kurzfunktionen zu bewerten, aber das ließ mich nicht.
Der Ausdruck war:
(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed
Die Ausgabe war:
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
Lincoln Bergeson
quelle
quelle
Antworten:
Sie würden wissen, dass% zur inneren Funktion gehört. Der Nachteil ist, dass Sie den Zugriff auf% in der äußeren Funktion verlieren würden.
Verwenden Sie
fn [x]
stattdessen die Syntax.quelle
%
äußeren fn, und zu den Zeiten, auf die Sie es getan haben, könnten Sie zurückgreifen(fn)
, richtig?Es ist völlig willkürlich; Der Parser enthält einige Zeilen, die ihn explizit deaktivieren. Wenn Sie diese Zeile bearbeiten, können Sie anonyme Funktionen verschachteln, die genau so funktionieren, wie Sie es erwarten.
Insbesondere die Zeilen 634-635 in https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java
quelle
fn [x]
Neufassung des OP-Codes die gleiche Funktionalität wie eine modifizierte Clojure-Version haben würde. Gibt es außerdem Probleme mit der Portabilität des Clojure-Codes?Sie können anonyme Funktionen der Sorte (fn [params] (body)) verschachteln. Nur die # -Syntax unterstützt keine Verschachtelung.
quelle