在Scheme的条件表达式中使用define
在Scheme中,程序定义的一般形式为: (定义()) 其中接受一系列表达式,允许此类过程定义:在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
> (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节):
- 在程序的最外层李>
- 在身体的开始
这就是为什么
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)