【发布时间】:2011-04-21 14:02:44
【问题描述】:
我有一个 Common Lisp 课程:
(defclass my-cool-class()
((variable1
:initarg :variable1
:accessor variable1
:initform (error "Must supply value to variable1"))
(variable2
:initarg :variable2
:accessor variable2
:initform (error "Must supply value to variable2"))
我想创建一个可以简化这种重复输入的宏
(defmacro make-slot (slot-name)
`(slot-name
:initarg :,slot-name
:accessor :,slot-name
:initform (error "Must supply value")))
最终我想拥有 (defclass my-cool-class () (make-slots '(foo bar baz)) 并自动将 foo、bar 和 baz 作为插槽。
但是,当我去制作一个 macroexpand-1 的 make-slot 时,男孩你好,我收到了阅读器错误。
第一个是“冒号后的非法终止字符......”然后它一直在继续。
SBCL 1.0.37。
编辑:系统上的示例在语法上是正确的,我在复制之前做了一些修改。
六个月后 -
(defun build-var (classname var)
(list var
:initform nil
:accessor (intern (concatenate 'string (string classname) "-"
(string var)))
:initarg (intern (string var) :keyword)))
(defun build-varlist (classname varlist)
(loop for var in varlist
collect (build-var classname var)))
(defmacro defobject (name &rest varlist)
"Defines a class with a set of behavior.
Variables are accessed by name-varname.
(defobject classname v1 v2 v3)
"
`(defclass ,name ()
,(build-varlist name varlist))):
两年半之后。
我在其他地方发现了六个月前的代码。虽然我很受宠若惊,但它也提醒我更新这个。
如果您喜欢这个想法,我将这段代码保留在:https://github.com/pnathan/defobject。和以前一样,它的目标是生成重复输入最少的 CLOS 类。存在一个类似的系统,称为 DEFCLASS-STAR。建议有兴趣的人同时查看两者。
【问题讨论】:
标签: macros lisp common-lisp