2009-03-24 5 views

답변

21
(defmacro defn-with-str [string args & body] 
`(defn ~(symbol string) ~args [email protected])) 

(defn-with-str "print-string" [k] (println k)) 

(print-string "lol") 
+0

1의 함수 이름 문자열을 평가 후면? 2. 몸 앞에 ~ @ 무엇입니까? – Belun

+1

@Belun 1. ~ = unquote 2. ~ @ = 확장 시퀀스 – Surya

+0

왜 내가 그렇게하면 (defn defns [] (don (map (fn [s] (defn-with-str s [k] (println k)))) [ "print-string"]))) 나는 's'라는 fn을 얻었습니까? – Hendekagon

14

더 나은의에게 대답을 dnolen 좋아하지만, 당신도이 작업을 수행 할 수 있습니다

(defn #=(symbol "print-string") [k] (println k))

#=()이 읽기 ​​시간에 평가됩니다. 나는 Clojure의 기능이 얼마나 안정적인지 모르겠다. 나는 미래에 변화하지 않기를 바랄 것이다. 매크로는 내가하는 방법이다.

17

dnolen의 솔루션은 매크로 확장 시간에 작동하며 Brian Carper는 읽기 시간에 작동합니다. 자, 여기 런타임에 대한 하나 : 참고로

(intern *ns* (symbol "a") (fn [k] (println k))) 
+0

멋진 점은 알지 못합니다. 한가지주의 할 점은 defn을 사용하면 var a에 함수 메타 데이터가 누락된다는 것입니다. – dnolen

7

-의 dnolen 대답은 def'd 또는 let'd 변수 문자열 리터럴 문자열 작동하지 않습니다.

(defmacro defn이-와-STR [스트링 인수 & 본체] `(defn이 ~ (심볼 열) ~ 인수 ~ 본체 @))

(DEF "안녕"hisym) (defn이-뿐인데 STR hisym []

는 이제 함수가 "hisym"

(안녕하세요)라고했다) ("안녕하세요"에 println) ->의 java.lang.Exception : 없음 기호를 해결하기 위해 : 안녕하세요이 상황에서 (NO_SOURCE_FILE : 6) (hisym) -> "hi"프린트

이 문제를 방지하려면

는 ~이 인수 앞에 무엇 매크로

(defmacro defn-with-str [string args & body]
`(defn ~(symbol (eval string)) ~args [email protected]))

관련 문제