arguments de mot-clé Clojure
-
23-08-2019 - |
Question
En Common Lisp, vous pouvez faire ceci:
(defun foo (bar &key baz quux)
(list bar baz quux))
(foo 1 :quux 3 :baz 2) ; => (1 2 3)
Clojure ne possèdent pas d'arguments mot-clé. Une alternative est la suivante:
(defn foo [bar {:keys [baz quux]}]
(list bar baz quux))
(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)
C'est trop de crochets imbriqués pour avoir à taper et lire tout le temps. Elle exige également un hachage explicite carte à transmettre en argument plutôt qu'une simple liste.
Quel est le plus idiomatiques équivalent Clojure des arguments de mots clés qui ne semble pas que quelqu'un a déclenché une bombe de ponctuation?
La solution
Une façon simple pour simuler args mot-clé dans clojure utilise-carte de hachage sur les paramètres de repos comme celui-ci:
> (defn kwtest [x & e] (:foo (apply hash-map e)))
#'user/kwtest
> (kwtest 12 :bar "ignored" :foo "returned")
"returned"
Rich Hickey a fourni une macro dans ce message du groupe google clojure vous donne des paramètres de mots clés. fil correspondant contient des informations sur la raison pour laquelle les paramètres clés sont pas pris en charge par clojure. Fondamentalement, pour éviter les frais généraux d'exécution. Rich explique la méthode que je l'ai montré ci-dessus dans ce message
Autres conseils
Pour mettre à jour cette réponse pour Clojure 1.2 il y a maintenant un support complet arg mot-clé avec les valeurs par défaut fournies par les formulaires de carte de liaison déstructurant :
user> (defn foo [bar &{ :keys [baz quux]
:or {baz "baz_default" quux "quux_default"}}]
(list bar baz quux))
#'user/foo
user> (foo 1 :quux 3)
(1 "baz_default" 3)