4
user> (map (fn [k] [k]) [1 2 3])
([1] [2] [3])
user> (map #([%1]) [1 2 3])
.... Error..
Pourquoi le deuxième exemple est-il une erreur?# lambda marco de Clojure n'est pas toujours le même que (fn)?
user> (map (fn [k] [k]) [1 2 3])
([1] [2] [3])
user> (map #([%1]) [1 2 3])
.... Error..
Pourquoi le deuxième exemple est-il une erreur?# lambda marco de Clojure n'est pas toujours le même que (fn)?
La macro lecteur #(<expr>)
enveloppe le <expr>
dans un ensemble supplémentaire de parenthèses, donc #([%1])
à quelque chose d'équivalent développe à (fn [%1] ([%1]))
et non (fn [%1] [%1])
. Donc tu as raison. Ils ne sont pas entièrement équivalents.
Vous pouvez essayer ce qui suit dans le REPL qui révèlera l'expansion exacte:
user=> '#([%1])
(fn* [p1__862#] ([p1__862#]))
user=> '#(inc %1)
(fn* [p1__865#] (inc p1__865#))
poursuivre votre exemple, vous pouvez utiliser (carte # (vecteur%) [1 2 3]) pour la même fonctionnalité. –
ou '(vecteur de carte [1 2 3])' – Sonicsmooth