Clojure의 String에서 함수를 defn하는 방법은 무엇입니까?
-
21-08-2019 - |
문제
나는 이것을하고 싶다 (대체 또는 어디서나)
(defn (symbol "print-string") [k] (println k))
그런 다음 할 수 있습니다
(print-string "lol")
또는 매크로스에서 사용자 정의 문자열에서 DEFN을 만들 수있는 다른 방법이 있다면 올바른 방향으로 나를 밀어 주시겠습니까?
해결책
(defmacro defn-with-str [string args & body]
`(defn ~(symbol string) ~args ~@body))
(defn-with-str "print-string" [k] (println k))
(print-string "lol")
다른 팁
Dnolen의 솔루션은 거시적 확장 시간에 작동하며 Brian Carper는 읽기 시간입니다. 이제 런타임을위한 것이 있습니다.
(intern *ns* (symbol "a") (fn [k] (println k)))
나는 Dnolen의 답변을 더 좋아하지만 이것도 할 수 있습니다.
(defn #=(symbol "print-string") [k] (println k))
#=()
읽기 시간에 평가됩니다. 나는 이것이 Clojure의 특징이 얼마나 안정적인지 모르겠다. 나는 미래에 변화하지 않는 것에 의존하지 않을 것이다. 매크로는 내가하는 방법입니다.
참고 - Dnolen의 답변은 문자 문자열에만 효과가 있으며, 변수의 문자열이 아닙니다.
(defmacro defn-with-str [String args & body]`(defn ~ (Symbol String) ~ args ~@body))
(def hisym "hi") (defn-with-str hisym [] (println "hi")))
이제 "Hisym"이라는 기능이 있습니다.
(hi) -> java.lang.exception : 해상도 할 수 없음 기호 : HI이 맥락에서 (no_source_file : 6) (Hisym) -> 인쇄 "Hi"
이를 피하려면 매크로에서 함수 이름 문자열을 평가하십시오.
(defmacro defn-with-str [string args & body]
`(defn ~(symbol (eval string)) ~args ~@body))