循环宏中的 Common Lisp 绑定

Common Lisp Binding in Loop Macro

我想在循环内重新绑定一个特殊变量。现在,通常,这是使用 let.

完成的
(let ((*read-eval* nil))
  (do-something-here))

但是由于 loop 宏有这些很好的 with 子句,我想我可以在那里这样做。表达式 (macroexpand '(loop with *read-eval* = nil)) 最终将绑定扩展为 let,因此它肯定会特别适用于我的实现。但我在 the standard 中找不到任何表明这是标准化行为的内容。所以,我想,我的问题是:

(loop with *read-eval* = nil
      for i from 1 to 10
      do (something-involving-the-read-function))

是否需要符合规范的实现来修改现有的 *read-eval* 变量,或者是否存在创建同名新词法变量的风险?

*read-eval*是全局特殊变量。无法撤消它,即为其创建本地词法绑定。

with clause is described as using bindings(与单纯的设置相反)这意味着,确实,一旦循环完成,我们将返回原始值(回答@joshua-tailor 的问题)。

让我们理性思考一下。 (loop with foo = nil ...) 确实为 foo 建立了绑定。因此,对于 (loop with *read-eval* = nil ...) not 建立绑定,实现必须检查(在宏扩展或编译时)*read-eval* 是否将是 dynamic variable在 运行 时间。这听起来很疯狂。