这是我目前自学的方案Scheme http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-1.html
据作者说,
然后我尝试了一个最小的例子
(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,否则不执行任何操作。有什么想法吗?
谢谢,
答案 0 :(得分:5)
if
语句,其中您为两个分支提供值。事实上,我刚刚检查过,看起来所有的“教学”方言都禁止你使用只有一个分支的if
语句。
这是为了帮助您学习使用applicative(有时称为functional)编程风格进行编程,其中您不依赖于副作用,而只是通过应用函数来计算值并从中返回结果。在应用程序样式中,没有副作用,语句的唯一结果是返回一个值。在其中一个分支中不返回值的if
语句对该情况没有意义;它没用,实际上当你试图使用if
语句返回的值时会导致未定义的行为。在applicative样式中,语言中的每个语句都是一个表达式,根据它计算的值进行评估,而不是它所引起的副作用。
如果您使用display
提供输出,则不使用纯粹的应用程序样式。这非常好,但是许多对Scheme的介绍都是从提出一种应用风格开始,因为它更容易推理并了解一切是如何实际运作的。
但是,由于您没有使用假定编程风格的文本,我建议您选择不同的方言。在“语言”菜单下,选择“选择语言”,然后我建议选择“R5RS”(尽可能接近标准)或“漂亮大”(这是R5RS加一堆)方便的PLT扩展)。
答案 1 :(得分:3)
您使用的是什么版本的Scheme? DrScheme 372对没有else子句的if语句没有问题。
在任何情况下,Scheme都提供when
和unless
运算符,它们的行为类似于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它应该工作