如何使用var中的向量进行结构化

时间:2013-10-27 09:52:48

标签: clojure destructuring

我想这样做

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

但是[a b c]保存在像这样的矢量中

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

是否有可能以某种方式使用var来定义如何构造?

2 个答案:

答案 0 :(得分:2)

发生错误,因为在此代码段中:

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

您将vect绑定到'(1 2 3)。先前定义为vect的{​​{1}}将被本地let绑定所遮蔽。 '[a b c]ab将保持不受约束。

我认为你可以做你所要求的唯一方法是使用(滥用?)eval / macros,并构建你需要的确切形式。

c

但是,我真的恳请你在这里加入一些hammock time并考虑为什么需要使用var进行结构化,以及可能的替代设计。上面的解决方案已经很糟糕了,使用它可能会非常难看......

答案 1 :(得分:1)

我同意丹尼尔可能会重新考虑为什么你需要这样做的原因,例如:你究竟遇到了什么问题。

但如果你坚持:)假装我们确实使用“a b c ..”,你可以这样做:

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

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