在拍,有两个名为通用号码的程序add1
和sub1
,相当于(curry + 1)
和(curryr - 1)
分别.
这些程序是否适合风格使用,或者它们是否具有某种优化效益?这些程序背后的历史是什么?
历史?
我们需要回到 1986 年,当时讨论了修订后的计划报告。
丹·弗里德曼写道:
在描述算术时,我发现符号“1+”和“-1+”非常有害。函数 + 用符号“+”表示,这让那些试图理解 + 的原始递归定义的人感到困惑。纯粹出于教学原因,我希望看到“add1”和“sub1”是可选的。我知道 macscheme 和 PC-Scheme 已包含它们。我不喜欢同一构造有多个名称,但报告中已经有一些实例。
在这里查看更多内容:
https://groups.csail.mit.edu/mac/ftpdir/scheme-mail/HTML/rrrs-1986/msg00246.html https://groups.csail.mit.edu/mac/ftpdir/scheme-mail/HTML /rrrs-1986/msg00251.html
事实证明,这个名称add1
并未纳入最低标准,但一些(非最低)实现包含了它(例如 Chez Scheme)。
根据实用方案[1],Chez 方案、Racket 和 Chicken 方案的实现包括add1
作为标准。我确信还有其他实现:
[1] http://practical-scheme.net/wiliki/schemexref.cgi?add1
至于它的用途:更方便(也更容易阅读)
(map add1 xs)
Run Code Online (Sandbox Code Playgroud)
比
(map (lambda (x) (+ x 1)) xs)
Run Code Online (Sandbox Code Playgroud)
如今,性能应该没有差异(但不要相信我的话 - 做一个基准)。曾几何时,一个简单的编译器可能会为第一个表达式生成更好的代码。一个好的编译器应该为两个表达式生成相同的输出。