我需要一个incf在增量期间执行某些边界检查的函数:
val := val + delta
if val >= 1.0
then return 1.0
else return val
Run Code Online (Sandbox Code Playgroud)
我可以这样写incf:
(defun incf-bounded(val delta)
(incf val delta)
(if (>= val 1.0) 1.0 val))
Run Code Online (Sandbox Code Playgroud)
在这种情况下我需要使用它(setf x (incf-bounded x delta)).但是我该怎么写一个我可以使用的(incf-bounded x delta),比如,哪里x会被修改?
我不知道这里发生了什么,文中的宏观例子.基本上,不熟悉如何使用get-setf-method,内置宏(可能是函数?).具体来说,get-setf-method的某些返回值为零的情况怎么样?例如(get-setf-method'x)
NIL ;
NIL ;
(#:NEW-3069) ;
(SETQ X #:NEW-3069) ;
X
Run Code Online (Sandbox Code Playgroud)
为什么这个示例代码首先将第五个返回值设置为第二个返回值,以进行初始化?最后它如何处理在表达式中设置变量的顺序,例如(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)
Run Code Online (Sandbox Code Playgroud)
这是宏的定义:
(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 …Run Code Online (Sandbox Code Playgroud)