if语句在Scheme中如何工作?

Cha*_*han 4 scheme

这是我目前正在自学的计划的链接,http://www.ccs.neu.edu/home/dorai/ty-scheme/ty-scheme-ZH-1.html

根据作者的说法, 在此处输入图片说明

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

(define (check-p x)
  (if (>= x 0)
      (display 1)))
Run Code Online (Sandbox Code Playgroud)

,而DrScheme给了我错误:

if: bad syntax (must have an "else" expression) in: (if (>= x 0) (display 1))
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Bri*_*ell 5

DrScheme包括Scheme的几种“教学”方言,它们是标准R 5 RS或R 6 RS Scheme的有限子集(它们施加的限制更多)。您使用的方言可能限制您使用if为两个分支都提供值的语句。实际上,我刚才检查了一下,似乎所有“教学”方言都禁止您使用if仅包含一个分支的语句。

这旨在帮助您学习应用性(有时称为功能性)编程风格的编程,在这种风格中,您不依赖于副作用,而是仅通过应用函数并从函数中返回结果来计算值。在应用样式中,没有副作用,一条语句的唯一结果就是返回一个值。if在该分支的其中一个分支中不返回值的语句在这种情况下将没有任何意义;它不会有用,并且实际上在您尝试使用该if语句返回的值时会导致未定义的行为。在应用风格中,语言中的每个语句都是一个表达式,对其计算的值进行评估,而不是其引起的副作用。

如果display用于提供输出,则说明您不是在使用纯粹的应用样式。很好,但是对Scheme的许多介绍都希望从呈现一种应用风格开始,因为这样可以更轻松地进行推理和了解一切的实际工作方式。

但是,由于您不是使用假定的编程风格编写文本,所以建议您选择其他方言。在“语言”菜单下,选择“选择语言”,然后我建议选择“ R5RS”(旨在尽可能接近标准)或“相当大”(即R5RS加一堆)方便的PLT扩展名)。

  • 这个答案有很多错误,我可能需要一些评论。(a)DrScheme现在被称为DrRacket;(b)但无论如何,它不是一种语言,而只是一种工具,该语言是Racket;(c)限制不仅限于教学语言,还限于球拍所采用的大多数语言,包括默认的“ #lang球拍”;(d)“应用性”几乎是一个空虚的术语,仅一本书就使用了,“功能性”是“更远”的通用性,远远超出了使用其他东西的道理; (3认同)
  • (e)禁止单分支`if'的意图远不只是讲授功能风格,以这种方式混合内容(重载`if`的两种用法)是不好的风格,相反,Racket继续前进强制使用两面的“ if”,对于一面的条件,它使用“ when”和“ unless”,它们还允许多表达式主体,并且对代码阅读者具有更明显的(副作用)含义;(f)在球拍中,带有结果的“ if”当然具有明确定义的含义-它返回该结果或“ void”-这几乎从来不是新手想要的。 (2认同)
  • (g)即使您使用副作用(无论“应用”的反面是什么),即使您具有单面的“ if”,它们仍然是“ if” *表达式*;(h)在Racket(或几乎任何方案实现)中,表达式和语句之间没有区别-后者不存在(至少在您所考虑的意义上没有);(i)使用“相当大”是“极不明智的建议”-它只是一种古老的语言,现在是一种古老的语言,不应用于任何实际工作(或学习); (2认同)