2013-03-25 3 views
3

그래서 def의 "name"부분에 함수를 전달하고 싶습니다. 문제는 : 동적 이름으로 값을 def'ine

내가 예를 들어려고 할 "데프에 첫 번째 인수가 기호해야한다"

(def serverNumber 5) 
(def (str "server" serverNumber) {:id serverNumber :value 4939}) 

하지만이 작업을 수행하는 annnnnnny 방법을 찾을 수 없습니다. 어떤 도움을 인정 넘어있을 것입니다 :)

+2

(대부분의 언어/시나리오에서) 동적 이름을 사용하는 것은 종종 잘못된 방법입니다. 이러한 값은 나중에 어떻게 균일하게 액세스됩니까? 다른 방법에 대해서는 [Clojure Data Structures] (http://clojure.org/data_structures)의 "Maps"를 참조하십시오. –

+0

("가변 변수"라는 용어는 대개 PHP와 연관되어 있지만 여기에서 묻는 것과 관련되어 있습니다.) –

답변

3

첫째, 나는 이것이 나쁜 생각처럼 보입니다. 왜 동적으로 생성 된 이름을 사용하여 def을 생성하려고합니까? (@pst가 이미 지적했듯이, 맵은 동적으로 생성 된 식별자로 바인딩을 만드는 일반적인 솔루션입니다.)

당신이 합법적 인 이유가 있다고 가정하면 (어쩌면 defs를 생성하는 라이브러리 기능의 일부일 수도 있습니다 사용자)를 위해, 당신은 매크로와 함께이 작업을 수행 할 수 있습니다 매크로는 컴파일 시간에 실행되기 때문에 이것은 단지) (최상위 레벨에서 작동

(defmacro def' [sym-exp & other-args] 
    `(def ~(-> sym-exp eval symbol) [email protected])) 

(def serverNumber 5) 
(def' (str "server" serverNumber) {:id serverNumber :value 4939}) 

참고. 당신이 기능 또는 뭔가 이렇게 할 경우, 당신은 단지 평가 사용할 필요가 : 당신은 그냥 에이전트의 무리를 만들려면

(defn def'' [sym-exp & other-args] 
    (eval `(def ~(-> sym-exp eval symbol) [email protected]))) 

,이 같은 아마 뭔가 작동합니다

(def servers 
    (vec (for [i (range 5)] 
     {:id i :value 4939}))) 

그럼 그냥 인덱스로 액세스 할 수 있습니다 :

(servers 0) 
; => {:id 0, :value 4939} 
+0

안녕하세요, 내가하려는 것은 다른 이름의 여러 에이전트를 만드는 것입니다. "server"유형의 6 개의 에이전트를 작성하여 각각 하나의 이름을 갖도록하려고합니다. server0 . . server5 –

+1

@FengHuo - 방금 "서버"변수를 생성하려면 왜 벡터에 넣지 않으십니까? 내 대답을 예제로 업데이트하겠습니다. – DaoWen

1

def의 런타임에 해당이 intern :

(intern *ns* 
     (symbol (str "server" server-number)) 
     {:id server-number :value 4939})