如何引用动态生成的符号?

时间:2013-03-20 11:58:50

标签: clojure

我正在尝试基于Java类的一些static public字段动态创建函数。所以在一个文件中我有类似的东西:

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

问题是我想在尚未定义的情况下调用该特定函数。

例如,Java类具有静态int PARENTHESIZED_EXPRESSION字段。由此我生成parenthesized-expression?函数。这非常好用,但是当我在使用这个函数的REPL中加载一个Clojure文件时,我得到了一个

  

无法解析parenthesized-expression?

错误。所以我必须确保符号首先被实习。我怎样才能做到这一点?

我意识到这不是一个非常实用的方法,但是我有点犹豫要为这个类的所有字段输入近80个类似的函数。此外,这个课程可能会有所变化。

1 个答案:

答案 0 :(得分: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=>