首页 > 解决方案 > 如果不评估,程序是否可以包含未绑定的变量?

问题描述

考虑以下程序,其中foobar尚未定义。

(define (f)
  foo)

(if #t
    (display "Hello!")
    bar)

这是一个有效的计划程序吗?只要这些变量从未被评估,Scheme 程序是否允许有未绑定的变量?

标签: scheme

解决方案


不,但是是的,但是不是……

解释最近 Scheme 报告中使用的术语Scheme programunboundvariable,答案似乎是否定的(请参阅我的其他答案以获取参考资料)。

但这取决于对示例代码的另一个假设 - 它if具有其通常含义,作为语言定义报告中描述的句法关键字。

因为 Scheme 程序中的标识符可以隐藏关键字,所以这是一个有效的 Scheme 程序,其中bar似乎未绑定:

(import (rnrs))
(let-syntax ([if (syntax-rules ()
      [(if e1 e2 _) (if e1 e2)])])
  (if #t
      (display "Hello!")
      bar))

所以:

$ scheme
> (top-level-program (import (rnrs))
  (let-syntax ([if (syntax-rules ()
        [(if e1 e2 _) (if e1 e2)])])
    (if #t
        (display "Hello!")
        bar)
    (if #f
        (display "Hello!")
        bar)))
Hello!
> 


推荐阅读