【问题标题】:Are "procedure" and "function" synonymous in Racket?Racket 中的“过程”和“功能”是同义词吗?
【发布时间】:2019-06-07 11:39:46
【问题描述】:

“过程”和“函数”在 Racket(Scheme 的一种方言)中是同义词吗? the documentation 似乎暗示了它。例如,compose 的文档将其描述为一个 过程

[r]返回一个组成给定函数过程...compose 函数 允许给定的函数消费和产生任意数量的 价值观...

(以上所有的斜体都是我添加的。)

我知道procedure? 是一个库过程,而function? 不是。我的问题是在讨论程序时(例如在上课或编写文档时)互换使用这些术语是否正确。

【问题讨论】:

    标签: function racket procedure terminology


    【解决方案1】:

    TL;博士这只是行话,意思是一样的。函数、过程和静态方法在编程中是一样的。

    从历史上看,函数在数学意义上是参数与结果之间的映射。过程是执行某些操作的代码块,其输出不需要绑定到任何特定输入。 因此你可以说函数是一个没有副作用的过程。

    Scheme 标准仅使用术语过程。你根本找不到任何关于函数的提示。 Racket 在历史上是一种用于教育目的的标准 Scheme 实现,并且在今天的大部分情况下仍然与 Scheme 兼容,但是它们已经进行了拆分并且不认为自己遵循 Scheme 标准。 How to design programs 和许多文档使用术语函数,在本文档中,它是过程的同义词。

    Common Lisp 一直使用术语函数及其前身,它早于 Scheme。

    我想我什至已经在语言之间翻译了一个 SO 答案并更改了代码以及只是切换了功能和程序以与语言术语本身保持一致。我希望有一天能看到 Racket 清理干净,并用一个名字来统治他们。

    【讨论】:

    • 我也很想在这里看到 Racket 的一致性。在这里对比 procedureprocess 可能有用吗?
    • 我不同意你的第一段。某些语言(例如 Pascal)区分函数和过程。
    • @EllenSpertus Pascal 确实如此,但两者都可能有副作用并且都需要参数,并且由于 Pascal 是基于 Algol 的,因此我敢打赌 void 函数(过程)是首先,然后他们添加了函数为返回值的过程。通过定义一个参数来保存返回值作为引用,过程可以很容易地用作函数。总而言之,Pascal 并没有区分过程和函数之间的实际差异,而只是用词来区分同一概念的变体。
    • @Sylwester 确实两者都有副作用,但在某些语言中还是有区别的。
    • @EllenSpertus 在我看来,区别并不在于命令式过程和数学函数之间的实际差异,而是它们需要一个新名称来扩展版本以保持旧代码兼容。 Pascal 是对 Algol 的一种新尝试,它对两者都使用了过程,而我猜 Pascal 开始时只是使用过程和具有返回值的过程,它们稍后会调用函数。你知道一种语言可以表达正义吗?
    【解决方案2】:

    简短版:是的。

    更长的版本:许多人在调整词汇以用于教学方面做得很好。这是我想到的第一篇论文,虽然它没有具体解决过程/函数的选择:

    https://cs.brown.edu/~sk/Publications/Papers/Published/mfk-measur-effect-error-msg-novice-sigcse/paper.pdf

    从教学的角度来看,当然,同一事物有两个名字是没有帮助的,叹息。

    最后,如果你在Racket Mailing List上问这个问题,你会得到一个更权威的答案(坦率地说,我想知道这里的情况如何)。

    [编辑] 哦,此外,我根本不会说 procedure 这个词更有可能表示库中定义的东西。

    【讨论】:

    • 谢谢。我正在考虑询问 Shriram 或 Racket Mailing List。我会回来报告的。
    • 我看不到链接的论文在哪里讨论对齐词汇。你能指出我正确的部分吗?
    • 我做了更多的挖掘,看起来这篇 2011 年的论文更直接地解决了词汇问题,特别是在第 5 节“词汇”中:cs.brown.edu/~sk/Publications/Papers/Published/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2014-03-08
    • 2020-08-14
    • 2012-08-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多