Lisp 在Scheme中返回副作用的惯例是什么?

Lisp 在Scheme中返回副作用的惯例是什么?,lisp,scheme,sicp,Lisp,Scheme,Sicp,我正在看麻省理工学院视频讲座系列的计算机程序的结构和解释,我有一个关于返回函数副作用的快速问题 在中,教授为每个编写了一个快速方程式,类似于: (define (for-each p l) (if (null? l) "done" (p (car l) (for-each p (cdr l))))) Scheme中的函数是否有返回副作用的特定约定,或者“done”是任意选择?这不是真正的副作用,而是每个Scheme函数都必须返回某些东西。字符串“

我正在看麻省理工学院视频讲座系列的计算机程序的结构和解释,我有一个关于返回函数副作用的快速问题

在中,教授为每个编写了一个快速方程式,类似于:

(define (for-each p l)
   (if (null? l)
      "done"
      (p (car l)
         (for-each p (cdr l)))))
Scheme中的函数是否有返回副作用的特定约定,或者
“done”
是任意选择?

这不是真正的副作用,而是每个Scheme函数都必须返回某些东西。字符串
“done”
是一个很重要的符号。通常,当您为每个调用
时,您可能会执行以下操作:

(for-each (lambda (x) (display x)) lst)

并忽略每个
返回值。作者也可以很容易地从基本案例中选择任何其他返回值。

+1。请注意,返回一个未指定的值。在SCM中,它实际上是一个显示为
#
的值。我的意思是,在Scheme中是否有一个表示“无”的值。。。除了空列表之外?@larsmans:那么,通过不从函数返回任何内容或是显式值来返回
#
。@JoshVoigts:不可能“不从函数返回任何内容”,因为函数体是一个表达式,语言中的每个表达式都必须计算为一个值
#
是一个自定义值,任意决定的Scheme的特定实现是一个函数的结果,该函数由标准的实现决定返回什么。获取这个“未指定”值的一个标准、简单的方法是
(if#f#t)
。因此,您的for-each程序示例可以切换真分支和假分支,然后删除假分支以返回此“未指定”值。