【发布时间】:2020-07-21 11:39:57
【问题描述】:
我正在尝试制作宏来定义类似于defparameter 和defvar 的各种对象。 defregion1 宏起作用:在执行时,它定义了一个带有对象region 的变量。但是,defregion2 只返回一个必须手动执行的表达式。代码如下:
(defclass location ()
((x
:initarg :x
:accessor x)
(y
:initarg :y
:accessor y)))
(defclass region ()
((x :initarg :x
:accessor x)
(y :initarg :y
:accessor y)
(w :initarg :w
:accessor w)
(h :initarg :h
:accessor h)))
(defmacro deflocation (var x y)
`(defparameter ,var `(make-instance 'location :x ,x :y ,y)))
(defmacro defregion1 (var x y w h)
`(defparameter ,(intern (symbol-name var))
(make-instance 'region :x ,x :y ,y :w ,w :h ,h)))
(defmacro defregion2 (var l1 l2)
`(with-slots ((x1 x) (y1 y))
,l1
(with-slots ((x2 x) (y2 y))
,l2
`(defparameter ,(intern (symbol-name ,var))
(make-instance 'region
:x ,x1 :y ,y1 :w (- ,x2 ,x1) :h (- ,y2 ,y1))))))
defregion1的输出:
(defregion1 *test-reg1* 1 2 3 4)
=> *test-reg1*
deferegion2的输出:
(deflocation *l1* 20 30)
(deflocation *l2* 50 60)
(defregion2 '*test-reg2* *l1* *l2*)
=> (DEFPARAMETER *TEST-REG2*
(MAKE-INSTANCE 'REGION :X 20 :Y 30 :W (- 50 20) :H (- 60 30)))
我希望*test-reg2* 也成为一个变量。这里有什么问题?
【问题讨论】:
标签: lisp common-lisp