我想知道在函数必须评估一系列s表达式的情况下是否可以用和替换 progn 。
例子来自如何设计程序(http://htdp.org/2003-09-26/Book/curriculum-Z-H-9.html#node_thm_6.6.12)
"开发绘制并清除矩形,绘制一个矩形,休眠一会儿,然后清除矩形。"
(define (draw-and-clear a-rectangle)
(and (draw-solid-rect... )
(sleep-for-a-while... )
(clear-solid-rect... )))
As和#的参数是按顺序计算的,与使用progn / begin表单有什么不同吗?
答案 0 :(得分:4)
progn
将按顺序评估每个S表达式。 and
在第一个返回false(#f
在Scheme中或nil
在Common Lisp中)之后不会评估任何内容。这种行为称为布尔运算符的short circuiting。
(同样,or
将不会在第一个返回真值的S表达式之后进行求值。)
答案 1 :(得分:2)
我还没有读过HtDP,但我认为他们使用的是and
而不是begin
,因为有些学生语言没有提供begin
。
在Scheme中,唯一的错误值是#f
,特别是许多“副作用”程序返回“未指定的值”¹,它总是一个真值,因此您可以使用{有效地对它们进行排序{1}}。这与Common Lisp形成对比,其中副作用程序通常返回and
,这是一个假值。
¹大多数Scheme实现将一致地返回相同类型的未指定值:在Racket中,它使用nil
,而在大多数其他没有(void)
的实现中,它都是(void)
}返回。