隐藏动态变量的部分
Shadowing parts of a dynamic variable
可能是我太有创意了。
是否可以将动态绑定的概念扩展到SETF
能够地方一个动态变量,这样我就可以遮蔽部分 具有 LET
绑定的动态变量(例如 plist)?
例如,我希望能够执行如下操作:
(defparameter *foo* '(:one 1))
(let (((getf *foo* :one) 2))
(do-things))
用 2 隐藏 :one 的值。
这个例子不起作用,因为 (getf *foo* :one)
不是 LET
可以赋值的变量名,但也许还有另一种方法?
没有标准方法,但一些实现可能会提供
扩展名,例如 letf
.
或者,您可以使用
unwind-protect
你自己:
(let ((old-value (getf *foo* :one)))
(unwind-protect
(progn (setf (getf *foo* :one) 2)
(do-things))
(setf (getf *foo* :one) old-value)))
如果这是您代码中的常见操作,您甚至可以为此定义一个宏:
(defmacro with-one (tmp-one &body body)
"Bind (getf *foo* :one) to tmp-one around body."
(let ((old-value (gensym "WITH-ONE-OLD")))
`(let ((,old-value (getf *foo* :one)))
(unwind-protect
(progn (setf (getf *foo* :one) ,tmp-one)
,@body)
(setf (getf *foo* :one) ,old-value)))))
可能是我太有创意了。
是否可以将动态绑定的概念扩展到SETF
能够地方一个动态变量,这样我就可以遮蔽部分 具有 LET
绑定的动态变量(例如 plist)?
例如,我希望能够执行如下操作:
(defparameter *foo* '(:one 1))
(let (((getf *foo* :one) 2))
(do-things))
用 2 隐藏 :one 的值。
这个例子不起作用,因为 (getf *foo* :one)
不是 LET
可以赋值的变量名,但也许还有另一种方法?
没有标准方法,但一些实现可能会提供
扩展名,例如 letf
.
或者,您可以使用
unwind-protect
你自己:
(let ((old-value (getf *foo* :one)))
(unwind-protect
(progn (setf (getf *foo* :one) 2)
(do-things))
(setf (getf *foo* :one) old-value)))
如果这是您代码中的常见操作,您甚至可以为此定义一个宏:
(defmacro with-one (tmp-one &body body)
"Bind (getf *foo* :one) to tmp-one around body."
(let ((old-value (gensym "WITH-ONE-OLD")))
`(let ((,old-value (getf *foo* :one)))
(unwind-protect
(progn (setf (getf *foo* :one) ,tmp-one)
,@body)
(setf (getf *foo* :one) ,old-value)))))