2013-03-20 3 views
0

Я пытаюсь динамически создавать функции на основе полей staticpublic класса Java. Таким образом, в одном файле у меня есть что-то вроде:Как ссылаться на динамически сгенерированный символ?

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

Проблема заключается в том, что я хочу назвать эту конкретную функцию, в то время как она еще не определена.

Например, класс Java имеет статическое поле int PARENTHESIZED_EXPRESSION. Из этого я создаю функцию parenthesized-expression?. Это работает довольно хорошо, но когда я загрузить файл Clojure в REPL, который использует эти функции я получаю

не в состоянии разрешить Скобки-выражение?

погрешность. Поэтому я должен убедиться, что символ сначала интернирован. Как я могу это сделать?

Я понимаю, что это не очень функциональный подход, но я немного не решаюсь ввести почти 80 подобных функций для всех полей этого класса. Кроме того, этот класс может быть изменен.

+3

вызова статического публичного статического поля класса прост: 'Класс/fieldName' Почему вы должны пойти этот сложный путь к создавать для них функции? – Ankur

+0

Я знаю, но я хочу заменить много (= (.getNodeType expr) ASTNode/PARENTHESIZED_EXPRESSION)) Подобные конструкции by (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. Благодарю. –

Смежные вопросы