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应该是一个程序.
你可能遗漏的一件事是,在Scheme中没有"声明"这样的东西.一切都是表达式,你可能认为语句的东西也会返回一个值.这适用于if,通常用于返回一个值(例如,(if (tea-drinker?) 'tea 'coffee)与C++不同,条件的大多数用法都不会用于改变变量或打印值.这减少了在if子句中使用多个表达式的需要.
但是,正如Ross和Rajesh指出的那样,你可以在你的条款中使用cond(推荐)或使用begins if.请注意,如果在条件语句中有许多副作用计算,则可能不会以惯用方式使用Scheme.
@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 所在的位置上效果很好。