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