Traté de evaluar una expresión Clojure con funciones abreviadas anidadas hoy, y no me lo permitió.
La expresión fue:
(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed
El resultado fue:
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
fuente
fuente
Respuestas:
Sabrías que% pertenece a la función interna. El inconveniente es que perdería el acceso al% en la función externa.
Use la
fn [x]
sintaxis en su lugar.fuente
%
exterior de la fn, y en las veces que lo hizo, podría recurrir a(fn)
, ¿verdad?Es completamente arbitrario; Hay un par de líneas en el analizador que lo desactivan explícitamente. Si edita esa línea, puede tener funciones anónimas anidadas, y actúan exactamente como cabría esperar.
específicamente, líneas 634-635 en https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java
fuente
fn [x]
reescritura del código del OP tenga una funcionalidad idéntica a una versión modificada de clojure. Además, ¿habría algún problema con la portabilidad del código clojure?Puede tener funciones anónimas anidadas del tipo (fn [params] (body)). Solo la sintaxis # no admite el anidamiento.
fuente