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 № 1Ihr 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