Lisp / Scheme:Progn vs And

时间:2014-12-11 10:41:16

标签: scheme lisp evaluation

我想知道在函数必须评估一系列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表单有什么不同吗?

2 个答案:

答案 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) }返回。