Clojure Schlüsselwort-Argumente
-
23-08-2019 - |
Frage
In Common Lisp Sie können dies tun:
(defun foo (bar &key baz quux)
(list bar baz quux))
(foo 1 :quux 3 :baz 2) ; => (1 2 3)
Clojure nicht über Keyword-Argumente. Eine Alternative ist dies:
(defn foo [bar {:keys [baz quux]}]
(list bar baz quux))
(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)
Das ist zu viele verschachtelten Klammern eingeben zu müssen und die ganze Zeit zu lesen. Es erfordert auch eine explizite Hash-Karte als Argument übergeben wird, statt einer einfachen Liste.
Was ist der idiomatische Clojure Äquivalent von Keyword-Argumente, die jemand sieht nicht ein Satz Bombe auslösen?
Lösung
Eine einfache Art und Weise Stichwort args in clojure zu simulieren verwendet Hash-Karte auf Rest-Parameter wie folgt aus:
> (defn kwtest [x & e] (:foo (apply hash-map e)))
#'user/kwtest
> (kwtest 12 :bar "ignored" :foo "returned")
"returned"
Reiche Hickey bereitgestellt ein Makro in diese Nachricht von der clojure Google-Gruppe dass gibt Ihnen Keyword-Parameter. Die entsprechenden Gewinde enthält Informationen darüber, warum Schlüsselwort-Parameter sind nicht von clojure unterstützt. Grundsätzlich zu vermeiden, die Overhead-Laufzeit. Rich erklärt die Methode, die ich oben in dieser Nachricht angezeigt haben
Andere Tipps
So aktualisieren Sie diese Antwort für Clojure 1.2 gibt es jetzt volles Stichwort arg Unterstützung mit Ausfällen durch die Kartenformen zur Verfügung gestellt von Destrukturierung Bindung :
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)
Ein kürzlich neben clojure.contrib.def
ist die defnk
Makro, die mit Schlüsselwort-Argumenten Definition von Funktionen ermöglicht (siehe hier ).