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