2013-10-27 4 views
0

내가하고 싶은이

(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

오류 때문에이 코드에서, 발생합니다 '(1 2 3)vect을 결합하고

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

합니다. 이전에 '[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 및 가능한 대안 설계를 사용하여 destructure해야하는 이유에 대해 생각하는 촉구한다. 위의 솔루션은 이미 꽤 해키하고 그것을 사용하면 매우 못생긴 얻을 수 있습니다 ...

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}