我有一個類中的Common Lisp:defmacro與defclass
(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-嗨,我得到讀者的錯誤。
第一個是「冒號後非法終止字符」,然後繼續執行。
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。建議有意者對兩者進行審覈。
嗯。我認爲 - 錯誤地顯然 - 宏觀將以替代方式擴張;因此,defclass會看到插槽列表。 – 2010-10-06 01:38:29
@Paul Nathan,Lisp應該如何確定MAKE-SLOT是一個宏而不是插槽的名稱? DEFCLASS語法清晰,它需要一個插槽列表。它並不期望一個函數評估爲插槽列表。 – 2010-10-06 01:49:58
啊,我想我的主要錯誤在於我如何擴展宏以及何時。 – 2010-10-06 16:42:27