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?

War es hilfreich?

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 ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top