如果`if`语句在Scheme中如何工作?

时间:2011-04-21 23:58:58

标签: scheme

这是我目前自学的方案Scheme http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-1.html

据作者说, enter image description here

然后我尝试了一个最小的例子

(define (check-p x)
  (if (>= x 0)
      (display 1)))

,DrScheme给了我错误:

if: bad syntax (must have an "else" expression) in: (if (>= x 0) (display 1))

如果我在if语句中添加一个额外的声明,那么它可以工作。但我不明白,为什么我们需要额外的声明呢?上面的代码声明对我有意义。如果数字大于0,则显示1,否则不执行任何操作。有什么想法吗?

谢谢,

3 个答案:

答案 0 :(得分:5)

Dr.Scheme包括Scheme的几种“教学”方言,这些方言是有限的子集(它们施加比标准R 5 RS或R 6 RS方案更多的限制。您正在使用的方言可能会限制您使用if语句,其中您为两个分支提供值。事实上,我刚刚检查过,看起来所有的“教学”方言都禁止你使用只有一个分支的if语句。

这是为了帮助您学习使用applicative(有时称为functional)编程风格进行编程,其中您不依赖于副作用,而只是通过应用函数来计算值并从中返回结果。在应用程序样式中,没有副作用,语句的唯一结果是返回一个值。在其中一个分支中不返回值的if语句对该情况没有意义;它没用,实际上当你试图使用if语句返回的值时会导致未定义的行为。在applicative样式中,语言中的每个语句都是一个表达式,根据它计算的值进行评估,而不是它所引起的副作用。

如果您使用display提供输出,则不使用纯粹的应用程序样式。这非常好,但是许多对Scheme的介绍都是从提出一种应用风格开始,因为它更容易推理并了解一切是如何实际运作的。

但是,由于您没有使用假定编程风格的文本,我建议您选择不同的方言。在“语言”菜单下,选择“选择语言”,然后我建议选择“R5RS”(尽可能接近标准)或“漂亮大”(这是R5RS加一堆)方便的PLT扩展)。

答案 1 :(得分:3)

您使用的是什么版本的Scheme? DrScheme 372对没有else子句的if语句没有问题。

在任何情况下,Scheme都提供whenunless运算符,它们的行为类似于if语句,它只包含一个then-branch或者只有一个else-branch。鉴于此,if语句没有迫切需要将其else分支作为可选项。

答案 2 :(得分:0)

尝试改变这个:

(define (check-p x)
(if (>= x 0)
(display 1)))

到此:

(define (check-p x)
(when (>= x 0)
(display 1)))

在Racket它应该工作

相关问题