문제

나는 이것을하고 싶다 (대체 또는 어디서나)

(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))

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top