我尝试为任意数量的变量编写 defparameter 宏,从单个变量的工作代码开始:
(defmacro defpar (name initial-value )
`(progn (declaim (special ,name))
(setf (symbol-value ',name) ,initial-value)
',name)
这是一个修改
(defmacro defpar (&rest rest)
(let ((i (gensym)))
`(let (,i)
;; (declaim (special ,rest))
(dotimes (,i (/ (length ',rest) 2))
(progn
(print (list ,i ',rest))
(setf (symbol-value ',(pop rest)) ',(pop rest))
)
))))
现在:
(defpar S1 1)
(print `("S1 = " ,S1))
给予
(0 (S1 1))
("S1 = " 1)
可以:S1 已定义且等于 1
对于两个参数
(defpar S1 1 S2 2)
(print `("S1 = " ,S1 " S2 = " ,S2 ))
给予
(0 (*S1* 1 *S2* 2))
(1 (*S1* 1 *S2* 2))
.... The variable *S2* is unbound.
正如我所检查的,rest列表在循环中的新迭代中是相同的,但我未能更新它。我错过了“特别”声明。 (declaim (special,rest)) 在 SBCL 中出现错误。让我知道是否重要。 请帮助我。也许它已经完成了,就像在 setf 中一样?
(defmacro defpar (&rest varname-val-list)
`(loop for (varname val) on ',varname-val-list by #'cddr
collect varname
do
;;(format t "~a = ~a~%" varname val)
(setf (symbol-value varname) val)))
在回复中:
CL-USER>(defpar-multiple xyz 2 aaa 3)
扩展到: