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