Scheme程序是否允许存在不会被求值的未绑定变量?
关于Scheme程序合法性的问题解答
你给出的代码如下:
(define (f) foo) (if #t (display "Hello!") bar)
这是一个合法的Scheme程序吗?
是,这个程序完全符合Scheme的语法规则,实际运行时会正常输出Hello!,不会抛出错误。
只要未绑定变量永远不会被求值,Scheme程序就允许其存在吗?
是的,这是由Scheme的求值规则决定的:
- Scheme仅对执行路径上实际需要用到的表达式求值,未被触发执行的代码不会进入求值阶段
- 你代码里的
foo定义在f的函数体内,只要全程不调用f,这部分代码永远不会被求值,不会触发未绑定变量的报错 - 后面的
if表达式条件固定为#t,只会执行第一个分支的(display "Hello!"),第二个分支的bar永远不会被求值,自然也不会报错 - 只有当你主动触发未绑定变量的求值时,解释器才会抛出错误,比如后续执行
(f)或者直接输入bar运行,才会触发未绑定报错
部分Scheme实现可能会在静态语法检查阶段给出未绑定变量的警告,但这只是提示性质,不会阻止程序正常运行,只要对应变量实际未被求值,程序就可以正常执行。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

