Common lisp 动态变量的阴影部分

Common lisp 动态变量的阴影部分,common-lisp,dynamic-binding,Common Lisp,Dynamic Binding,也许我在这里太有创意了 是否可以将动态绑定的概念扩展到动态变量的SETFable位置,这样我就可以使用LET绑定来隐藏动态变量的一部分(例如plist) 例如,我希望能够做到以下几点: (defparameter *foo* '(:one 1)) (let (((getf *foo* :one) 2)) (do-things)) 要隐藏的值:1与2 这个例子不起作用,因为(getf*foo*:one)不是LET可以赋值的变量名,但可能有另一种方法?没有标准方法,但一些实现可能提供 扩展,

也许我在这里太有创意了

是否可以将动态绑定的概念扩展到动态变量的
SETF
able位置,这样我就可以使用
LET
绑定来隐藏动态变量的一部分(例如plist)

例如,我希望能够做到以下几点:

(defparameter *foo* '(:one 1))

(let (((getf *foo* :one) 2))
  (do-things))
要隐藏的值:1与2


这个例子不起作用,因为
(getf*foo*:one)
不是
LET
可以赋值的变量名,但可能有另一种方法?

没有标准方法,但一些实现可能提供 扩展,例如

或者,您可以使用 你自己:

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

没有标准的方法,但有些实现可能提供 扩展,例如

或者,您可以使用 你自己:

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

在plists和alist的情况下,您可以对以前的绑定进行阴影处理,而不是修改基础列表(并发/可重入代码可能会有问题):
(let((*foo*(list*:one 2*foo*)))…)
在plists和alist的情况下,您可以对以前的绑定进行阴影处理,而不是修改基础列表(并发/可重入代码可能会有问题):
(let((*foo*(list*:一个2*foo*))…)