如何在Clojure中通过输入符号名的字符串创建类型?

如何在Clojure中通过输入符号名的字符串创建类型?,clojure,symbols,deftype,Clojure,Symbols,Deftype,我正在尝试创建一个类型列表——这样我就可以映射一个字符串列表并创建我需要的所有类型 这就是我的目标: (defprotocol P (methodname [arg1])) (deftype T [f] P (methodname [arg1] (println "methodname called"))) 对于从字符串名称生成类型的单个实例,我正在尝试: (defmacro create-type [type-name field-list protocol-name protocol-s

我正在尝试创建一个类型列表——这样我就可以映射一个字符串列表并创建我需要的所有类型

这就是我的目标:

(defprotocol P (methodname [arg1]))

(deftype T [f] P (methodname [arg1] (println "methodname called")))
对于从字符串名称生成类型的单个实例,我正在尝试:

(defmacro create-type [type-name field-list protocol-name protocol-sig]
  `(deftype ~type-name ~field-list ~protocol-name ~protocol-sig))

(create-type (symbol "type-name") [field1]  (symbol "P") (methodname [arg1]))
这在以下情况下失败:

ClassCastException clojure.lang.PersistentList cannot be cast to clojure.lang.Symbol  clojure.core/ns-resolve (core.clj:4026)

我的问题是:如何从输入的符号名字符串中创建Clojure中的类型?

有点老套,但对我来说适用:

(defprotocol P (methodname [arg1]))`

(defmacro gen-type [type-name field-list proto-name proto-sig]
`(load-string (str "(deftype " ~type-name " " ~(str field-list) ~(str proto-name) ~(str proto-sig) ")")))

(gen-type "T" [f1 f2] P (methodname [arg1]))
所以我基本上只是构建一个字符串,并与读者一起评估它

没有加载字符串仍然不太灵活,但执行以下操作:

(defmacro gentype [t f p m a b]
  `(deftype ~(symbol t) ~f ~p (~m ~a ~b)))

(gentype "T3" [f1 f2] P methodname [arg1] (prn arg1))

括号闭合错误,或者我遗漏了什么?请注意,[field1]关闭了括号,所以整个列表实际上是创建类型符号类型名称[field1]谢谢-修复-基本问题仍然存在。请欣赏“可以做”的态度。这绝对是一种倒退。我只是希望有一个不涉及读取字符串的解决方案:我想我知道怎么做,我会很快编辑我的答案。