隐藏动态变量的部分

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)))))