(SICP) 函数和过程有什么区别?

(SICP) What is the difference between functions and procedures?

我目前正在通过计算机程序的结构和解释来学习 Brian Harvey 的书和​​讲座(他在某些方面很搞笑),但是我还没有真正拥有我的“啊哈!时刻”与差异化函数和过程。

现在,我在讲座和阅读之外进行了研究,发现了一些关于同一个问题的不同帖子,但所有帖子似乎都分支到单独的 discussions/opinions 中,以讨论真正的解释或过时的定义。我看到的一个一般性答案是函数 return 一个值,而过程则没有,但是这对我来说并没有太多解释,而且该响应的大多数用户似乎对这个答案有一些争论。

深入了解文本和讲座中的高阶过程我完全理解概念和它提供的功能,但是我很困惑,因为我会听到“高阶过程”和“高阶函数”。 Brian Harvey 还提到“高阶过程代表高阶函数”。

我了解到下面两个函数是同一个函数,只是不同的程序。

f(x) = 2x + 6
g(x) = 2(x + 3)

在下文中,make-adder 被称为以 num 作为形式参数的过程。 make-adder的域是数字,范围是程序。我想真正让我难过的是他指的是 lambda 表达式,一个 lambda 表达式,但是 make-adder 是 returning 一个过程?

(define (make-adder num)
  (lambda (x) (+ x num))

(define plus3 (make-adder 3))
(plus3 8)

我以为我有一个清晰的理解,直到在高阶程序课程中提到了一些程序,此后一切都变得模糊了。

是否可以举个例子来帮助区分这两者?谢谢!

TL; DR: 过程和函数在 SICP 上下文中意思相同。

在数学中,函数是您应用参数和 return 一个值,并且总是 return 将相同的值应用于相同的参数。您可以将其替换为结果参数之间的映射。

在 Scheme 或 JavaScript 等编程语言中,对于所有具有某种副作用的代码或 return 与参数。

过程是一个更通用的术语,因此您不能说过程需要具有引用透明性才能将其视为数学函数,因此 Scheme 和 JavaScript 都有过程而不是函数。例如。 x86 intel 平台中的子例程是一个过程。它不允许参数和 return 值,只允许跳转和 return。但是,C 使用代码来操纵堆栈,以便能够传递参数并获得 return 值,从这个意义上说,您可以模拟“函数”,但它们并没有消除 return 不存在的可能性对于每个输入都相同,因此您可以实现一个不是函数的“c 函数”,但您可以将其称为过程。