Versión idiomática Clojure de KeyError de Python

¿Cómo debe expresarse esta pitón?

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

en clojure? Esto funciona, pero ¿es correcto?

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

editar: para aclarar, esta pregunta es sobre la parte de lanzamiento de excepciones, no la parte de definición de mapas

preguntado el 03 de mayo de 12 a las 18:05

Creo que tu ejemplo es el clojure más idiomático. -

2 Respuestas

Su ejemplo original está bien. Dos enfoques con los que también es probable que te encuentres:

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

Más información en clojure.core/if-let ¿Más información sobre clojure.core/contains?

contestado el 03 de mayo de 12 a las 19:05

Solo usa un hashmap regular:

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

si no desea proporcionar palabras clave (como :keyword) pero prefiere cadenas, deberá usar (get gl-enums str) in gl-enum

contestado el 03 de mayo de 12 a las 18:05

¿Qué? Creo que la pregunta es cuál es la mejor manera de lanzar una excepción si no hay una entrada en un mapa. - Andrew Cooke

@andrewcooke: sí. sí lo es. - amara

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.