2015-01-26 3 views
0

Я пытаюсь создать список типов - чтобы я мог сопоставить список строк и создать все типы, которые мне нужны.Как создать тип в Clojure с помощью ввода строк для имен символов?

Это где я и добиваюсь:

(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 от входа Stri ngs для имен символов?

+1

Неправильный закрывающая скобка, или я что-то не хватает? Обратите внимание, что '[field1])' закрывает скобки, поэтому весь список на самом деле '(create-type (symbol" type-name ") [field1])' – m0skit0

+0

Остается проблема с исправлением проблемы. – hawkeye

ответ

0

Bit Hacky, но работает для меня:

(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)) 
+0

Цените свое отношение. Это определенно спад. Я просто хочу, чтобы было решение, которое не включало 'read-string' :) – hawkeye

+0

Я думаю, что знаю, как это сделать, я скоро отредактирую свой ответ. –

+0

Попробуйте это сейчас. :) –