代码之家  ›  专栏  ›  技术社区  ›  hawkeye

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

  •  0
  • hawkeye  · 技术社区  · 11 年前

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

    这就是我的目标:

    (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中创建类型?

    1 回复  |  直到 11 年前
        1
  •  0
  •   Mate Varga    11 年前

    有点古怪,但对我有用:

    (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))
    
    推荐文章