그래서 def의 "name"부분에 함수를 전달하고 싶습니다. 문제는 : 동적 이름으로 값을 def'ine
내가 예를 들어려고 할 "데프에 첫 번째 인수가 기호해야한다"
(def serverNumber 5)
(def (str "server" serverNumber) {:id serverNumber :value 4939})
하지만이 작업을 수행하는 annnnnnny 방법을 찾을 수 없습니다. 어떤 도움을 인정 넘어있을 것입니다 :)
그래서 def의 "name"부분에 함수를 전달하고 싶습니다. 문제는 : 동적 이름으로 값을 def'ine
내가 예를 들어려고 할 "데프에 첫 번째 인수가 기호해야한다"
(def serverNumber 5)
(def (str "server" serverNumber) {:id serverNumber :value 4939})
하지만이 작업을 수행하는 annnnnnny 방법을 찾을 수 없습니다. 어떤 도움을 인정 넘어있을 것입니다 :)
첫째, 나는 이것이 나쁜 생각처럼 보입니다. 왜 동적으로 생성 된 이름을 사용하여 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}
안녕하세요, 내가하려는 것은 다른 이름의 여러 에이전트를 만드는 것입니다. "server"유형의 6 개의 에이전트를 작성하여 각각 하나의 이름을 갖도록하려고합니다. server0 . . server5 –
@FengHuo - 방금 "서버"변수를 생성하려면 왜 벡터에 넣지 않으십니까? 내 대답을 예제로 업데이트하겠습니다. – DaoWen
def
의 런타임에 해당이 intern
:
(intern *ns*
(symbol (str "server" server-number))
{:id server-number :value 4939})
(대부분의 언어/시나리오에서) 동적 이름을 사용하는 것은 종종 잘못된 방법입니다. 이러한 값은 나중에 어떻게 균일하게 액세스됩니까? 다른 방법에 대해서는 [Clojure Data Structures] (http://clojure.org/data_structures)의 "Maps"를 참조하십시오. –
("가변 변수"라는 용어는 대개 PHP와 연관되어 있지만 여기에서 묻는 것과 관련되어 있습니다.) –