【问题标题】:Common Lisp: how to pass keyword arguments to another function?Common Lisp:如何将关键字参数传递给另一个函数?
【发布时间】:2021-01-06 22:45:28
【问题描述】:

这里是普通 Lisp 新手。我无法理解 Lisp 函数中的参数传递。例如,想象一下 Common Lisp 中的以下函数定义(比如 SBCL):

(defun foo (x <&-keyword goes here> args)
  (let ((v (make-hash-table args)))
    (setf (gethash "foo" v) x)
    v))

我的问题是:在这种情况下,是否有一个 &-keyword 我可以指定将 foo 中的关键字参数传递给 make-hash-table?我已经尝试将 &amp;rest 作为 & 关键字,它总是给我以下警告:

; caught WARNING:
;   The function MAKE-HASH-TABLE is called with odd number of keyword arguments.

我还阅读了有关 &amp;allow-other-keys 作为可能的 & 关键字的信息,但似乎没有找到 make-hash-tablefoo 中如何使用其他键。因此,我很难过。关键字参数可以传递给 Common Lisp 中的内部函数调用吗?如果有,怎么做?

【问题讨论】:

    标签: parameter-passing common-lisp


    【解决方案1】:

    你要找的是apply:

    (defun foo (x &rest mht-arguments)
      (let ((v (apply #'make-hash-table mht-arguments)))
        (setf (gethash "foo" v) x)
        v))
    

    另请参阅 my other answer,了解如何将其与 &amp;key 结合使用。

    【讨论】:

    • 谢谢。这行得通,尽管让我有点不安的是,每一个论点都被 &rest 吞没了。我来自特定领域的 R,其中语言只是自动确定将哪些参数传递给哪个函数。但我想这更好,因为你必须知道正在传递什么。再次感谢。
    • 你也可以这样做 - 你可以让foo 接受一个包含所有make-hash-table 参数的单个 列表参数。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2020-07-12
    • 2011-07-26
    • 1970-01-01
    • 2017-08-01
    • 2012-09-25
    • 2020-10-03
    相关资源
    最近更新 更多