2013-03-20 4 views
0

Java 클래스의 일부 staticpublic 필드를 기반으로 함수를 동적으로 만들려고합니다. 그래서 하나의 파일에서 나는 다음과 같은 것을 가지고 있습니다 :어떻게 동적으로 생성 된 심볼을 참조합니까?

(intern *ns* (symbol (get-fieldname-from-class class)) some-func) 

문제는 아직 정의되지 않은 상태에서 특정 기능을 호출하려고합니다.

예를 들어 Java 클래스에는 정적 int PARENTHESIZED_EXPRESSION 필드가 있습니다. 이것에서 나는 parenthesized-expression? 함수를 생성합니다. 이것은 꽤 잘 작동하지만이 함수를 사용하는 REPL에 Clojure 파일을로드하면

괄호 안의 표현식을 해결할 수 없습니까?

오류. 그래서 나는 그 상징이 먼저 억류되어 있는지 확인해야한다. 어떻게해야합니까?

실용적인 접근 방식이 아니라는 것을 알고 있지만이 클래스의 모든 필드에 대해 비슷한 기능을 거의 80 개 입력하는 것을 주저합니다. 게다가이 클래스는 변경 될 수 있습니다.

+3

는 간단하다'클래스/fieldName' 당신은이 복잡한 길을 갈 필요가 이유는 무엇입니까 그들을위한 함수를 만들 수 있습니까? – Ankur

+0

나도 알아,하지만 난 (= (.getNodeType expr) ASTNode/PARENTHESIZED_EXPRESSION))을 (괄호로 묶인 표현식? expr)을 사용하여 많이 바꿔야한다. –

답변

1

당신이이 같은 매크로를 사용하여 얻을 수 있는지 궁금 : 클래스의 정적 공공 정적 필드 호출

user=> (defmacro f [sym] `(defn ~(symbol (str sym "?")) [x#] (= x# ~(symbol (str "java.util.Calendar/" (str sym)))))) 
#'user/f 
user=> (f DAY_OF_MONTH) 
#'user/DAY_OF_MONTH? 
user=> (DAY_OF_MONTH? java.util.Calendar/DAY_OF_WEEK) 
false 
user=> (DAY_OF_MONTH? java.util.Calendar/DAY_OF_MONTH) 
true 
user=> 
+0

나는이 defmacro의 변종을 사용했다. 감사. –

관련 문제