/ / Idiomatic Clojure-Version von Pythons KeyError - Python, Clojure, Redewendungen

Idiomatische Clojure-Version von Pythons KeyError - Python, Clojure, Idiome

Wie soll diese Python ausgedrückt werden?

gl_enums = ... # map from name to values for opengl enums
# use with gl_enums["enum name"]

in clojure? Das funktioniert, aber stimmt das?

(def gl-enums ...) ; map from name to values for opengl enums
(defn gl-enum [k] (or (gl-enums k) (throw (SomeException.))))
; use with (gl-enum :enum-name)

edit: zur Verdeutlichung handelt es sich bei dieser Frage um den ausnahme-auslösenden Teil, nicht um den kartendefinierenden Teil

Antworten:

4 für die Antwort № 1

Ihr ursprüngliches Beispiel ist in Ordnung. Zwei Ansätze, auf die Sie wahrscheinlich auch stoßen:

;; not very idiomatic
(defn example
[m]
(if (contains? m :name)
(:name m)
(throw (IllegalArgumentException. (format "key %s is missing" :name)))))

;; idiomatic
(defn example
[m]
(if-let [v (:name m)]
v
(throw (IllegalArgumentException. (format "key %s is missing" :name)))))

Mehr auf clojure.core / if-let Mehr auf clojure.core / enthält?


-1 für die Antwort № 2

Verwenden Sie einfach eine reguläre Hashmap:

(def gl-enums {:name1 "value1", :name2 "value2",
:name3 "value3", ...})

wenn Sie keine Keywords angeben möchten (wie :keyword) aber bevorzugen Sie Zeichenfolgen, müssen Sie verwenden (get gl-enums str) im gl-enum