【问题标题】:Arity of + and - operators in Lisp Flavored ErlangLisp Flavored Erlang 中 + 和 - 运算符的数量
【发布时间】:2017-01-31 14:37:09
【问题描述】:

由于我刚开始学习 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 ....)。如果您觉得这应该是一个单独的问题,请帮助我使用术语,因为我有点迷茫。

【问题讨论】:

    标签: lfe


    【解决方案1】:

    我也刚刚开始使用 LFE,但据我所知,it doesn't support variadic functions。这让我认为数学运算符只接受 2 个参数。这个工作的事实:(+ 1 2 3 4 5) 让我觉得有一个宏正在运行。

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

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

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

    【讨论】:

    • 是的,我也开始得出同样的结论。我的印象是有一个原始的 add 函数,它只接受两个参数,并且 + 函数被实现为接受参数列表并递归处理它。可能,该递归的基本情况(具有单个元素的列表)被编写为返回单个元素本身 - 这就是 #'+/1 起作用的原因。或者,有两个具有不同数量的 + 函数:一个接受单个元素并返回它,另一个接受两个(并递归调用前者)。我只是猜测这对 Erlang 也不太了解。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多