2013-10-27 8 views
0

我想這樣做我怎樣可以用向量解構從VAR

(let [[a b c] '(1 2 3)] 
    {:a a :b b :c c}) ;; gives {:a 1, :b 2, :c 3} 

但隨着保存在一個向量像這樣

(def vect '[a b c]) 
(let [vect '(1 2 3)] 
    {:a a :b b :c c}) ;; complains that a is unresolved 

[a b c]是否有可能以某種方式使用VAR來定義如何解構?

回答

2

出現該錯誤,因爲在這個片斷:

(let [vect '(1 2 3)] 
    {:a a :b b :c c}) 

你結合vect'(1 2 3)。之前定義爲'[a b c]vect將被本地let綁定所遮蔽。 a,bc將被解除鎖定。

我認爲你可以做你所要求的唯一方法是使用(濫用?)eval /宏,並建立你需要的確切形式。

(eval (list 'let [vect ''(1 2 3)] '{:a a :b b :c c})) 
;; => {:a 1 :b 2 :c 3} 

可是,我真的勸你把一些hammock time這裏,想想爲什麼你需要使用var和可能的替代設計,以解構。上面的解決方案已經很hacky和使用它可能會變得非常難看...

1

我會同意丹尼爾可能重新考慮的原因爲什麼你需要做到這一點,例如,你究竟遇到了什麼問題。

但如果你堅持:),假裝我們從字面上一起工作 「A B C ..」 S,你可以這樣做:

user=> (def xs '[a b c]) 
#'user/xs 

user=> (into {} (for [v xs] [(keyword v) v])) 
{:a a, :b b, :c c}