J'ai essayé d'évaluer une expression Clojure avec des fonctions sténographiques imbriquées aujourd'hui, et cela ne m'a pas permis.
L'expression était:
(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed
Le résultat était:
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
la source
la source
Réponses:
Vous sauriez que% appartient à la fonction interne. L'inconvénient est que vous perdriez l'accès au% dans la fonction externe.
Utilisez
fn [x]
plutôt la syntaxe.la source
%
fn externe, et les fois où vous l'avez fait, vous pourriez vous replier sur(fn)
, non?C'est complètement arbitraire; il y a quelques lignes dans l'analyseur qui le désactivent explicitement. Si vous modifiez cette ligne, vous pouvez avoir des fonctions anonymes imbriquées et elles agissent exactement comme vous vous y attendez.
en particulier, les lignes 634-635 dans https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java
la source
fn [x]
réécriture du code de l'OP aurait des fonctionnalités identiques à une version clojure modifiée. De plus, y aurait-il un problème avec la portabilité du code de clôture?Vous pouvez avoir des fonctions anonymes imbriquées de type (fn [params] (body)). Seule la syntaxe # ne prend pas en charge l'imbrication.
la source