53 votes

Arguments de mots clés Clojure

Dans 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 n'a pas d'argument de 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. Cela nécessite également qu'une hash-map explicite soit transmise en tant qu'argument plutôt qu'en tant que liste à plat.

Quel est l'équivalent Clojure le plus idiomatique des arguments de mots clés qui ne semblent pas déclencher une bombe de ponctuation?

100voto

Alex Stoddard Points 5300

Pour mettre à jour cette réponse pour Clojure 1.2, il existe désormais une prise en charge complète du mot-clé arg avec les valeurs par défaut fournies par les formes de carte de la liaison destructrice :

 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)
 

38voto

rincewind Points 1855

Une façon simple de simuler le mot-clé args en clojure est à l'aide de hachage de la carte sur le reste des paramètres comme ceci:

> (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 de la clojure groupe google qui vous donne les paramètres de mot clé. Le correspondant thread contient des informations au sujet de pourquoi les paramètres de mot clé ne sont pas pris en charge par clojure. Fondamentalement, pour éviter la gestion d'exécution. Riche en explique la méthode que j'ai indiqué ci-dessus dans ce message

9voto

pmf Points 3796

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X