我想使用宏来创建一个类实例。
我的意思是我想创建一个像这样的表达式:
(make-instance 'message :id id :mid mid)
我这样定义类。
(defclass message ()
((id
:initarg :id
:initform 0
:accessor id)
(mid
:initarg :mid
:initform 0
:accessor mid)))
(defmethod print-object ((obj message) stream)
(print-unreadable-object (obj stream :type t)
(with-slots (id mid) obj
(format stream "~A ~A " id mid))))
和这样的宏。
(defun slotlist (alist)
(mapcan
#'(lambda (x)
(let* ((s (closer-mop:slot-definition-name x))
(k (intern (symbol-name s) :keyword))
(v (assoc k alist)))
(if v (list k (cdr v)))))
(closer-mop:class-direct-slots (find-class 'message))))
(defmacro create-message (alist)
(let ((a (gensym)))
`(let ((,a (slotlist ,alist)))
(make-instance 'message ,@a))))
和 json-obj 类似:
(setq json-obj '((:id . 1) (:mid . 2)))
当我应用宏创建消息时
(create-message json-obj)
它扩展为:
(LET ((#:G1111 (SLOTLIST JSON-ALIT)))
(MAKE-INSTANCE 'MESSAGE . #:G1111))
但是实例没有正确初始化,因为它显示实例的值为#
我是否必须拼接 map 函数字符串并使用 apply 函数?