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?

Était-ce utile?

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)

Un ajout récent à clojure.contrib.def est la macro defnk, ce qui permet de définir des fonctions avec des arguments de mots-clés (voir ).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top