Lisp/Scheme:Progn vs And

Lisp/Scheme:Progn vs And,scheme,lisp,evaluation,Scheme,Lisp,Evaluation,我想知道,在函数必须计算s表达式序列的情况下,是否可以用和替换progn 示例来自如何设计程序() 开发“绘制并清除矩形”,它绘制一个矩形,休眠一段时间,然后清除该矩形 由于and的参数是按顺序计算的,与使用progn/begin表单有什么区别吗?我没有读过HtDP,但是,我认为他们使用的是和而不是begin,因为一些学生语言不提供begin 在Scheme中,唯一的假值是#f,特别是,许多“副作用”过程返回“未指定的值”,该值始终是真值,因此您可以使用和对它们进行有效排序。这与常见的Lisp形

我想知道,在函数必须计算s表达式序列的情况下,是否可以用替换progn

示例来自如何设计程序()

开发“绘制并清除矩形”,它绘制一个矩形,休眠一段时间,然后清除该矩形


由于and的参数是按顺序计算的,与使用progn/begin表单有什么区别吗?

我没有读过HtDP,但是,我认为他们使用的是
而不是
begin
,因为一些学生语言不提供
begin

在Scheme中,唯一的假值是
#f
,特别是,许多“副作用”过程返回“未指定的值”,该值始终是真值,因此您可以使用
对它们进行有效排序。这与常见的Lisp形成对比,在Lisp中,副作用过程通常返回
nil
,这是一个假值


大多数Scheme实现都会一致地返回相同类型的未指定值:在Racket中,它使用
(void)
,而在大多数其他没有
(void)
的实现中,它返回的是
(cond)

但是,我没有读过HtDP,我认为他们使用了
而不是
开始
,因为一些学生语言不提供
开始

在Scheme中,唯一的假值是
#f
,特别是,许多“副作用”过程返回“未指定的值”,该值始终是真值,因此您可以使用
对它们进行有效排序。这与常见的Lisp形成对比,在Lisp中,副作用过程通常返回
nil
,这是一个假值


大多数Scheme实现都会一致地返回相同类型的未指定值:在Racket中,它使用
(void)
,而在大多数其他没有
(void)
(void)
)的实现中,无论
(cond)
返回什么,它都将按顺序计算其每个s表达式
将不会在第一个返回false的值之后计算任何值(Scheme中为
#f或Common Lisp中为nil)。这种行为称为布尔运算符的集合


(类似地,
将不计算第一个返回真值的S表达式之后的任何S表达式。)

progn
将按顺序计算其每个S表达式
将不会在第一个返回false的值之后计算任何值(Scheme中为#f或Common Lisp中为nil)。这种行为称为布尔运算符的集合


(类似地,
不会计算第一个返回真值的S表达式之后的任何S表达式。)

当其中一个子窗体返回NIL时,大多数版本的和在Lisp中都会停止。PROGN将始终运行所有子窗体,当其中一个子窗体返回NIL时,Lisp中和的大多数版本将停止。PROGN将始终运行所有子窗体,我认为对于CommonLisp不是这样。许多有副作用的函数返回某种对象…@Rainer我不是指线性更新函数(比如
nreverse
),我指的是像
setf
这样纯粹用于副作用的东西。这很奇怪。公共Lisp中的SETF返回最后一种形式的多个值……哎呀,在写这些注释之前,我应该有CLH在我面前。:-)我们可以看到这样的代码
(let((obj…))(foo(setf obj(make bar:baz 42))…obj…
。这需要SETF返回一些有用的东西……我不认为这对commonlisp是正确的。许多有副作用的函数返回某种对象…@Rainer我不是指线性更新函数(比如
nreverse
),我指的是像
setf
这样纯粹用于副作用的东西。这很奇怪。公共Lisp中的SETF返回最后一种形式的多个值……哎呀,在写这些注释之前,我应该有CLH在我面前。:-)我们可以看到这样的代码
(let((obj…))(foo(setf obj(make bar:baz 42))…obj…
。这需要SETF返回一些有用的东西。。。
(define (draw-and-clear a-rectangle)
  (and (draw-solid-rect... )
       (sleep-for-a-while... )
       (clear-solid-rect... )))