Code: Select all
(defclass db-object () ())
(defun slot-list-from-query (query)
(format t "slot-list-from-query: ~s~&" query)
(mapcar
#'(lambda (pair)
(format t "pair: ~s~&" pair)
(let ((name (string-upcase (symbol-name (car pair)))))
(list (intern name)
:accessor
(intern (concatenate 'string name "-OF"))
:initarg (intern name "KEYWORD")))) query))
(defun make-class-with-slots (name slots)
(format t "defining class: ~s, slots: ~s~&" name slots)
`(defclass ,name (db-object) ,slots))
(defmacro table-to-class (name describe-table-query)
`(let ((db-class (make-class-with-slots
',name
(slot-list-from-query ,describe-table-query))))
(eval db-class) ; this line particularly bothers me.
(defmethod initialize-instance :after ((object ,name) &key raw-data)
(mapcar
#'(lambda (pair)
(setf (slot-value object
(find-symbol
(string-upcase
(symbol-name (car pair)))))
(cdr pair))) raw-data))
db-class))
I've also duplicated the code here http://pastebin.com/iXXMCDad for better readability.