条件语句的主体内是否有可能存在多个语句?

Ale*_* D. 18 scheme if-statement conditional-statements

我主要是一个C++(因此是一个OO /命令式)程序员,我觉得很奇怪的是,在一个条件语句中,每个评估只能有一个语句,例如函数式语言Scheme中的if语句.

例如:

 (let ((arg1 0) (arg2 1))
   (if (> arg1 arg2)
       arg1
       arg2)))
Run Code Online (Sandbox Code Playgroud)

错误的例子:

(let ((arg1 0) (arg2 1))
  (if (> arg1 arg2)
      (arg1 (display "cool"))
      (arg2 (display "not cool"))))
Run Code Online (Sandbox Code Playgroud)

给我一个错误的类型"程序应用程序:预期程序,给定:2;参数是:#void"

这可以通过将所述条件语句放入定义函数体内的不同语句中来解决,例如,条件语句的主体每次都有单独的语句,如下所示:

(if (condition) statement1a statement2a)
(if (condition) statement1b statement2b)
Run Code Online (Sandbox Code Playgroud)

等等...

不言而喻,这不太实际.更不用说重复的代码开销了.

我在这里遗漏了什么,还是没有别的办法?

Raj*_*hat 15

(let((arg1 0)(arg2 1))
  (if (> arg1 arg2) 
      (begin
        (display arg1)
        (newline)
        (display "cool"))
      (begin
        (display arg2)
        (newline)
        (display "not cool"))))
Run Code Online (Sandbox Code Playgroud)

当你说(arg1(显然"酷"))你暗示arg1应该是一个程序.


Asu*_*awa 9

你可能遗漏的一件事是,在Scheme中没有"声明"这样的东西.一切都是表达式,你可能认为语句的东西也会返回一个值.这适用于if,通常用于返回一个值(例如,(if (tea-drinker?) 'tea 'coffee)与C++不同,条件的大多数用法都不会用于改变变量或打印值.这减少了在if子句中使用多个表达式的需要.

但是,正如Ross和Rajesh指出的那样,你可以在你的条款中使用cond(推荐)或使用begins if.请注意,如果在条件语句中有许多副作用计算,则可能不会以惯用方式使用Scheme.

  • 您是否看过[如何设计程序](http://www.htdp.org/)?这是一本教科书,指导您完成以功能样式设计功能的过程(尽管在最后它也谈到了使用变异)。还有一个进行中的[第二版](http://www.ccs.neu.edu/home/matthias/HtDP2e/index.html),具有重大改进。 (2认同)

Ros*_*son 7

@RajeshBhat 给出了一个使用 if 语句开始的好例子。

另一种解决方案是cond形式

(let ([arg1 0] [arg2 1])
  (cond
    [(< arg1 0) (display "negative!")]
    [(> arg1 arg2) (display arg1) (newline) (display "cool")]
    [else (display arg2) (newline) (display "not cool")]))
Run Code Online (Sandbox Code Playgroud)

表单中的每一行cond都有一个隐含的内容begin,如果您查看cond.

(链接是 Chez 方案文档,可能(阅读:可能)与您使用的实现不同,因为它是专有的,尽管 Petite Chez 是免费的(娇小版本中没有编译器))

http://scheme.com/tspl4/syntax.html#./syntax:s39

编辑:关于开始形式以及所有具有隐式开始的表达式的重要说明。

下面的代码

(+ 2 (begin 3 4 5))
Run Code Online (Sandbox Code Playgroud)

计算结果为 7。这是因为表单的返回值begin是其最后一个表达式。这只是开始使用时要记住的事情。然而,使用副作用和诸如显示之类的东西在 3 和 4 所在的位置上效果很好。