0

因为我刚开始学习 LFE,所以我在阅读章节时一直在尝试书中的一些示例(SICP,LFE 版本)。在第 76 页的练习 1.4 中,我看到了表达式#'+/2#'-/2

所以我进入 REPL(funcall #'+/2 1 2)并得到(如预期的那样)3。同样(funcall #'+/1 1)给出1. 但是(funcall #'+/3 1 2 3)会报错。为什么是这样?我当然可以这样做,(funcall #'+/2 1 (funcall #' +/2 2 3))但我真的很想了解是否以及为什么#'+/3无效,因为它似乎是。

最后,有点切题,如果我正在实现自己的函数FUNC,我将如何实现以这种方式接受任意数量参数的能力(funcall #'FUNC/arity ....)。如果您觉得这应该是一个单独的问题,请帮助我使用术语,因为我有点迷茫。

4

1 回答 1

1

我也刚刚开始使用 LFE,但据我所知,它不支持可变参数函数。这让我认为数学运算符只接受 2 个参数。这有效的事实:(+ 1 2 3 4 5)让我认为有一个宏正在运行。

根据这个线程, LFE 宏显然可以有任意数量的参数,尽管我还没有深入研究宏。

我的 (n00b) 建议是:如果您认为需要可变参数函数,请尝试将列表而不是可变参数传递给您的函数。如果您仍然认为需要可变参数函数,请考虑将其设为宏。

我怀疑这是一个合理的建议:避免编写宏,除非真的没有更好的选择。它们在我用过的每种语言中都更难分析、调试和使用,虽然它们在 LISP 中比在大多数其他语言中更好,但我认为这个建议仍然有效。

于 2017-02-04T14:17:29.763 回答