首先,在Scheme中使用
display
在终端上显示文本,在
#!racket
中,您也可以使用
displayln
以及
许多其他更专业的过程。
在Java(以及许多其他C后代/方言)中,if的格式几乎与Scheme相同:
if ( x < 3 )
return 0;
else
return 10;
在Scheme中看起来非常相似:
(if (< x 3)
0
10)
如果你需要执行更多需要一条语句的操作,你需要将它们分组。在Java(以及所有C衍生语言)中,我们通过用大括号{}
将多个语句组合成一个来实现。例如:
{
System.out.println("Side effect " + localVar);
return 10;
}
上述内容是在任何语句允许的地方都是有效的块。在Scheme中,您可以使用begin
来表示块。
(begin (display "Side effect\n")
10)
过程体和let形式被认为具有显式的begin
。这意味着它允许多个表达式。但只有尾部表达式被视为“返回”。
Scheme中许多特殊形式都有显式的begin
。在Java中,您没有这样的选项,因为在这些情况下,您必须使用花括号。例如,过程体:
(lambda (arg)
(define test 10)
(+ test arg))
let
、let*
、letrec
等仅仅是匿名过程调用,因此它们的主体继承了lambda
的显式开始。在cond
的结果和替代方案中,你可以使用它们:
(cond ((hash-ref hash test) #f)
((> test 10) (hash-set! hash test #t) #t)
(else (hash-set! hash test #t) test))
cond
通常是一个宏,可以转换为if
。它们之间的区别在于隐式开始和支持多个术语。因此,在需要显式开始或代替嵌套的if
时,使用cond
很好。结果是更易读的代码,更加平坦。上面的cond
可以用if
这样写:
(if (hash-ref hash test)
#f
(if (> test 10)
(begin
(hash-set! hash test #t)
#t)
(begin
(hash-set! hash test #t)
test)))
正如您所看到的,cond
更加紧凑,如果您熟悉 Scheme,那么它更容易阅读。正确的缩进非常重要,因此使用可以自动缩进的 IDE 将有助于您编写其他 Scheme 程序员可以阅读的代码。由于您标记了 racket
,因此您可以使用 DrRacket 并经常按下 CTRL + i。