在Scheme的条件表达式中使用define

在Scheme的条件表达式中使用define,scheme,naming,conditional-operator,Scheme,Naming,Conditional Operator,在Scheme中,程序定义的一般形式为: (定义()) 其中接受一系列表达式,允许此类过程定义: > (define (f) 1 2 3) > (f) 3 同样,条件表达式的一般形式为: (cond()…) 在每个子句中,接受一系列表达式,允许这种条件表达式: > (cond (#t 1 2 3)) 3 但是为什么我不能像在过程定义的主体中一样,在条件表达式的子句的结果中使用define 比较: > (define (f) (define x 1) (define y

在Scheme中,程序定义的一般形式为:

(定义())

其中接受一系列表达式,允许此类过程定义:

> (define (f) 1 2 3)
> (f)
3
同样,条件表达式的一般形式为:

(cond()…)

在每个子句中,接受一系列表达式,允许这种条件表达式:

> (cond (#t 1 2 3))
3
但是为什么我不能像在过程定义的主体中一样,在条件表达式的子句的结果中使用
define

比较:

> (define (f) (define x 1) (define y 1) (define z 1) (+ x y z))
> (f)
3
与:

注-我在MacOS 10.15.2上使用Chibi Scheme 0.8.0实现。

正如@Barmar所指出的,定义不是表达式,但有两种上下文都允许(请参阅我的第5.1节):

  • 在程序的最外层
  • 在身体的开始
Scheme程序由一个或多个导入声明以及一系列表达式和定义组成。导入声明指定程序或库所依赖的库;库导出的标识符子集可供程序使用。表达式在第4章中描述。定义可以是变量定义、语法定义或记录类型定义,所有这些都将在本章中进行解释它们在允许表达式的某些(但不是所有)上下文中有效,特别是在表达式的最外层⟨程序⟩ 而在一场战争的开始⟨身体⟩.


这就是为什么
define
允许出现在过程定义的主体中,但不允许出现在条件表达式的子句的结果中,因为它不是主体。R7RS规范规定,
cond
的子句是
expression definition*expression*
。但看起来他们实际上是在实现R6RS规范,而R6RS规范一开始就不允许定义。@Barmar在规范中看到了什么?我在第4.2.1段中看到了这一点:(⟨测试⟩ ⟨表达1⟩ ...)”. 您是否在另一个R7RS兼容实现上尝试过它?我的错误。cond子句引用的是
,而不是
。因此,原因是定义不是表达式。定义只能放在某些位置,例如过程体的开头和
let
体的开头。
> (cond (#t (define x 1) (define y 1) (define z 1) (+ x y z)))
ERROR on line 1: unexpected define: (define x 1)