【发布时间】:2014-02-19 20:12:25
【问题描述】:
我不确定这里发生了什么,文本中的一个宏示例。 基本上,不习惯如何使用 get-setf-method,一个内置宏(也许是函数?)。 具体来说,get-setf-method的一些返回值是nil的情况如何? 例如 (get-setf-method 'x)
NIL ;
NIL ;
(#:NEW-3069) ;
(SETQ X #:NEW-3069) ;
X
为什么这个示例代码首先将第五个返回值设置为第二个返回值,用于初始化? 最后它如何处理在表达式中设置变量的顺序,例如 (aref ar (incf i)
(get-setf-method '(aref ar (incf i)))
(#:G3070 #:G3071) ;
(AR (INCF I)) ;
(#:G3072) ;
(SYSTEM::STORE #:G3070 #:G3071 #:G3072) ;
(AREF #:G3070 #:G3071)
这是宏的定义:
(defmacro sortf (op &rest places)
(let* ((meths (mapcar #'(lambda (p)
(multiple-value-list
(get-setf-method p)))
places))
(temps (apply #'append (mapcar #'third meths))))
`(let* ,(mapcar #'list
(mapcan #'(lambda (m)
(append (first m)
(third m)))
meths)
(mapcan #'(lambda (m)
(append (second m)
(list (fifth m))))
meths))
,@(mapcon #'(lambda (rest)
(mapcar
#'(lambda (arg)
`(unless (,op ,(car rest) ,arg)
(rotatef ,(car rest) ,arg)))
(cdr rest)))
temps)
,@(mapcar #'fourth meths))))
【问题讨论】:
-
一句警告:如果您不将环境参数传递给 g-s-e,您的宏可能会设置错误的位置。将 &environment env 添加到包含宏的 lambda 列表中,然后将 env 作为第二个参数传递给 g-s-e。 &environment 参数不会改变宏的调用方式。在 On Lisp 中更容易理解的 g-s-e 示例是 _F。
标签: lisp common-lisp