scheme - 如果不评估,程序是否可以包含未绑定的变量?
问题描述
考虑以下程序,其中foo
和bar
尚未定义。
(define (f)
foo)
(if #t
(display "Hello!")
bar)
这是一个有效的计划程序吗?只要这些变量从未被评估,Scheme 程序是否允许有未绑定的变量?
解决方案
不,但是是的,但是不是……
解释最近 Scheme 报告中使用的术语Scheme program、unbound和variable,答案似乎是否定的(请参阅我的其他答案以获取参考资料)。
但这取决于对示例代码的另一个假设 - 它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!
>
推荐阅读
- arrays - 给定唯一整数数组,当迭代时,是否有可能知道 O(1) 中已经访问过的“先前最接近的较大”?
- php - 在数据库中使用调整大小的列或拆分表
- c# - 异常:System.NullReferenceException
- apache-spark - 在pyspark中计算窗口上列的百分位数
- javascript - 如何以对象数组的形式传递数据?
- azure-active-directory - 是否可以使用在单个 Azure 租户中注册的 APP 在多个域中创建用户。使用 Graph Rest API
- spring-boot - Spring Boot Preflight 请求未通过访问控制检查
- angular - 如何将我的 Angular 应用程序转换为 Http 模式
- python - 比较两列中的字符串以生成新列
- wso2 - WSO2 脚本调解器将整数显示为浮点数