Clojure - construye consuelo de un vector de hashmap -- lojure camp Relacionados El problema

clojure - build condp from a vector of hashmap


3
vote

problema

Español

Me gustaría construir un condp dinámico de un hashmap. Tengo la siguiente estructura: [{: Valor 50: Ret "Valor50"} {: Valor 100: Ret "Value100}]

Me gustaría crear la siguiente condp dinámicamente:

  (condp < n 50 "value50" 100 "value100" "default")   

¿Debo tener que usar una macro para crear esta expresión?

Original en ingles

I would like to build a dynamic condp from a hashmap. I have the following structure: [{ :value 50 :ret "value50" } { :value 100 :ret "value100 }]

I would like to put create the following condp dynamically:

(condp < n 50 "value50" 100 "value100" "default") 

Should i have to use a macro to create this expression?

  
 
 

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

si. Una macro generaría la forma correcta para usted.

  (defmacro mycondp   [pred expr coll]   `(condp ~pred ~expr      ~@(mapcat (juxt :value :ret) coll)      "default"))   

Ejemplo:

  (macroexpand-1 '(mycondp < n [{:value 50 :ret "value50"}])) ;; => (clojure.core/condp < n 50 "value50" "default")   
 

Yes. A macro would generate the correct form for you.

(defmacro mycondp   [pred expr coll]   `(condp ~pred ~expr      ~@(mapcat (juxt :value :ret) coll)      "default")) 

Example:

(macroexpand-1 '(mycondp < n [{:value 50 :ret "value50"}])) ;; => (clojure.core/condp < n 50 "value50" "default") 
 
 
 
 
3
 
vote

de (doc condp) = & gt;

... For each clause, (pred test-expr expr) is evaluated. If it returns logical true, the clause is a match. ...

Eso significa que en el caso promedio tendrá comparaciones de M / 2, donde M es el número de entradas en su HASH-MAP para que pueda encontrar una mejor solución si el rendimiento importa en su escenario.

De todos modos, aquí tienes una solución alternativa, no digo que sea más eficiente, un poco más fácil de leer para el codificador promedio como yo

  (def n 90) (def clauses (hash-map 50 "value50", 100 "value100")) (get clauses (first (filter #(< n %) (sort (keys clauses)))) "default")   

editado para garantizar la evaluación de las cláusulas

 

from (doc condp) =>

... For each clause, (pred test-expr expr) is evaluated. If it returns logical true, the clause is a match. ...

That means that on the average case you will have m/2 comparisons where m is the number of entries in your hash-map so you might find a better solution if performance matters in your scenario.

Anyway Here you have an alternative solution, I don't say it's more efficient, just a little bit easier to read for the average coder as myself

(def n 90) (def clauses (hash-map 50 "value50", 100 "value100")) (get clauses (first (filter #(< n %) (sort (keys clauses)))) "default") 

Edited to ensure in order evaluation of clauses

 
 
         
         

Relacionados problema

11  Enfoque idiomático para estructurar el código fuente de Clojure [cerrado]  ( Idiomatic approach for structuring clojure source code ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...

3  ¿Cuáles son los pasos involucrados en la compilación de un archivo de Clojure?  ( What are the steps involved in compiling a clojure file ) 
Tengo curiosidad por saber qué sucede realmente cuando un archivo de Clojure se compila en archivos de clase. ¿Qué sucede con las macros cuando un archivo est...

5  Definiendo multipotores de Clojure  ( Defining clojure multimethods ) 
Tengo lo siguiente en un espacio de nombres Diga shapes : (derive ::rect ::shape) (derive ::square ::rect) Ahora ejecutando lo siguiente en el espacio...

88  Generando permutaciones perezosamente  ( Generating permutations lazily ) 
Estoy buscando un algoritmo para generar permutaciones de un conjunto de tal manera que pueda hacer una lista perezosa de ellos en Clojure. I.E. Me gustaría i...

22  Soporte macro en F #  ( Macro support in f ) 
Después de leer Practical Common Lisp, finalmente entendí cuál era el gran problema de Macros, y he estado buscando un idioma para la plataforma .NET que apoy...

1  DBMaintain like Herramienta para el Clojure para la migración de la base de datos  ( Dbmaintain like tool for clojure for database migration ) 
¿Hay una dbmaintain ¿Herramienta como Clojure? Me gustaría usar SQL directamente para DDL en lugar de un DSL, usando un DSL para DML y las consultas está ...

3  Átomo solo vs múltiples refs  ( Single atom vs multiple refs ) 
¿Qué son los compensaciones del estado que representan un solo átomo y un hashmap vs múltiples refs? Por ejemplo: (def start (atom {:location "Chicago" :...

28  Cloyure o Scala para bioinformática / bioestadística / investigación médica [cerrado]  ( Clojure or scala for bioinformatics biostatistics medical research ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...

1  tirar git - cambia de java  ( Git pull changes from java ) 
Tengo una aplicación web que sirve algunos archivos de Markdown. Lo que me gustaría hacer es cuando hay un empujón a GitHub, haría ping mi aplicación usando u...

34  ¿Hay buenos puntos de referencia de Clojure?  ( Are there any good clojure benchmarks ) 
Editar: Los puntos de referencia de Clojure están arriba en El juego de puntos de referencia . He hecho esta pregunta Wiki de la comunidad e invite a o...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos