Using Clojure deftype as a parameterized function
我正在尝试在编译器中使用clojure,因此需要参数化对
1 2 3 4 5 6 7 8 9 | (defn describe [x] (let [fields (.getDeclaredFields x) names (map #(.getName %) fields) types (map #(.getType %) fields)] (interleave types names))) (defn direct [] (deftype direct-type [^int x])) (defn indirect-helper [] (list ^int (symbol"x"))) (defn indirect [] (eval `(deftype ~(symbol "indirect-type") ~(indirect-helper)))) |
以及REPL的以下会话:
1 2 3 4 5 6 7 8 9 10 | Clojure 1.2.0-master-SNAPSHOT 1:1 user=> #<Namespace dataclass> 1:2 dataclass=> (direct) dataclass.direct-type 1:3 dataclass=> (indirect) dataclass.indirect-type 1:4 dataclass=> (describe direct-type) (int"x") 1:5 dataclass=> (describe indirect-type) (java.lang.Object"x") |
请注意,为间接类型生成的类已丢失直接类型的^ int提示具有。如何获得这些提示?
您需要将
1 | (defn indirect-helper [] [(with-meta (symbol"x") {:tag 'int})]) |
,原因是
在问题文本
现在,在这种情况下,符号是在运行时生成的,因此您不能使用读取器元数据来附加类型提示。输入
1 2 3 4 | user> (indirect) user.indirect-type user> (describe indirect-type) (int"x") |
(顺便说一句,我认为