2016-03-28 9 views
0

(I this Frage sah, aber es ist ein anderes Problem) lassenDynamische Variablen hinzufügen Anweisung in clojure

ich dynamisch in die Lage sein will. Also um folgendes zu bekommen:

(let [a (my-fn :a) 
     b (my-fn :b) 
     c (my-fn :c)]) 

könnte ich sowas machen? (Vor allem, ohne Makros?)

(let [ (map (fn [x] '(x (my-fn x))) 
      [:a :b :c])]) ;;<- this code obviously doesn't work 

EDIT: Ich habe versucht, über das Problem allgemein zu sein, aber vielleicht zu viel so. Auf die Idee hin, dass dies ein XY-Problem ist, dass ich mein wirkliches Problem mit einer schlechten Lösung lösen könnte, hier ist, was ich will: Formen im Re-Frame zu machen, die viele Eingaben haben können, und die Komplexität des Schreibens zu reduzieren immer und immer wieder dasselbe. Ex:

(let [project-form (re-frame/subscribe [:project-form]) 
     id   (rand-int 10000) 
     project-name (reaction (:project-name @project-form)) 
     social-acct (reaction (:social-acct @project-form)) 
     contact  (reaction (:contact @project-form)) 
     description (reaction (:description @project-form))] ...) 
+0

@glts: guter Vorschlag, ich bearbeitet die Frage mit den Details –

Antwort

1

Ich denke, das ist der nächste Sie ohne Verwendung eines Makro zu bekommen:

(ns clj.core 
    (:require [clojure.string :as str]) 
    (:use tupelo.core)) 

(def data { :a 1 
       :b 2 
       :c 3 }) 

(let [ks  [:a :b :c] 
     v2  (reduce (fn [result curr-key] 
         (update result curr-key inc)) 
         data 
         ks) 
     _ (spyx v2) 
     {:keys [:a :b :c]} v2 
    ; {:keys ks}   v2 <- this one won't work 
] 
    (spyx [a b c]) 
) 

(defn -main []) 

;=> v2 => {:a 2, :b 3, :c 4} 
;=> [a b c] => [2 3 4] 

Wir sind Teil der Probleme vermeiden kann, indem einfach auf die Originalkarte der Operationen zu tun, bevor Sie versuchen, um die Daten in separate Symbole zu transformieren. Da die Destrukturierung mit :keys zur Kompilierzeit "eingerichtet" wird, kann sie nicht den Vektor ks verwenden, der (zur Laufzeit) zur Laufzeit wechseln könnte. Um das letzte Bit der Wiederholung von [:a :b :c] zweimal aufgeführt zu bekommen, denke ich, dass Sie ein Makro verwenden müssten.

+0

ah, große Antwort. Ich denke, dass mir klar wird, dass dies eine kompliziertere Herangehensweise an mein spezifisches Problem sein kann, aber Ihre Antwort ist die perfekte Antwort auf meine Frage, und es ist gut zu wissen, dass die Destrukturierung von Schlüsseln zur Kompilierungszeit eingerichtet wurde.) –