(SICP)功能和步骤之间有什么区别?

时间:2020-09-05 16:38:03

标签: function procedure sicp

我目前正在通过计算机程序的结构和解释来完成布莱恩·哈维(Brian Harvey)的书和讲课(他在这一点上很搞笑),但是我还没有真正实现具有区别功能的“啊哈!时刻”。程序。

现在,我在演讲和阅读之外进行了研究,并且遇到了一些有关同一问题的不同文章,但是似乎所有文章都针对真正的解释或过时的定义展开了单独的讨论/观点。我看到的一个普遍答案是,函数返回一个值,而过程则不返回,但是这对我来说并不能解决很多问题,大多数用户对此回答似乎有些反对。

在课文和讲座中深入研究高阶程序,我完全理解其概念和功能,但是我感到困惑,因为我会听到“高阶程序”和“高阶函数”。布赖恩·哈维(Brian Harvey)还提到“高阶过程代表高阶函数”。

我了解下面的两个功能是相同的功能,但过程不同。

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

现在,在下面,make-adder被称为以num作为形式参数的过程。加法器的域是数字,范围是程序。我想真正让我感到难过的是,他指的是lambda表达式,即lambda表达式,但是make-adder返回一个过程吗?

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

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

我认为我有一个清晰的认识,直到在高阶过程课中对过程的一些引用,这才使事情变得模糊起来。

有没有可能通过示例来帮助区分两者?谢谢!

1 个答案:

答案 0 :(得分:2)

TL; DR: 在SICP中,过程和功能的含义相同。

在数学中,函数是要与参数一起应用并返回一个值的函数,并且始终会将相同的值返回给相同的参数。您可以将其替换为结果参数之间的映射。

在诸如Scheme或JavaScript之类的编程语言中,单词函数的使用不适用于所有具有某种副作用或返回值与参数不一致的代码。

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