如何在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]谢谢-修复-基本问题仍然存在。请欣赏“可以做”的态度。这绝对是一种倒退。我只是希望有一个不涉及读取字符串的解决方案:我想我知道怎么做,我会很快编辑我的答案。