我想做这个
(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 来定义如何解构?
我想做这个
(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 来定义如何解构?
发生错误,因为在此代码段中:
(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 进行解构,以及可能的替代设计。上面的解决方案已经很老套了,使用它可能会变得非常难看......
我同意 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}