0

我想做这个

(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 来定义如何解构?

4

2 回答 2

2

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

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

你绑定vect'(1 2 3). vect较早定义为较早的'[a b c]将被本地 let 绑定遮蔽。a,b并且c将不受约束。

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

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

但是,我真的强烈建议您在这里花一些时间,想想为什么需要使用 var 进行解构,以及可能的替代设计。上面的解决方案已经很老套了,使用它可能会变得非常难看......

于 2013-10-27T11:09:43.643 回答
1

我同意 Daniel 可能重新考虑你需要这样做的原因例如你到底要解决什么问题。

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

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

user=> (into {} (for [v xs] [(keyword v) v]))
{:a a, :b b, :c c}
于 2013-10-28T01:34:46.993 回答