循环宏中的 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在 运行 时间。这听起来很疯狂。
我想在循环内重新绑定一个特殊变量。现在,通常,这是使用 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在 运行 时间。这听起来很疯狂。