【发布时间】:2018-06-17 13:48:21
【问题描述】:
我有这个功能:
(defun call-generic-function (gf &rest args)
(let* ((applicable-methods (compute-applicable-methods gf args))
(most-specific-method (select-next-method-to-call
applicable-methods)))
(print "applicable methods")
(print (length applicable-methods))
(print args)
(print (values-list args))
(funcall (method-function most-specific-method)
(values-list args)
(remove most-specific-method applicable-methods))))
我希望 values-list 给我列表 args 的所有元素(这是两个对象,作为三个预期参数中的两个通过 funcall 传递给被调用方法),但它只给出第一个元素我得到一个错误,我只提供 2 个参数而不是预期的 3 个参数。这可以通过以下事实得到证实:(print args) 打印出 2 个对象的列表,但 (print (values-list args)) 仅打印出这些对象中的第一个。我该如何纠正这个问题?
结果(打印参数):
(#S(OBJECT
:CLASS #S(CLASS
:DIRECT-SUPERCLASS #S(CLASS
:DIRECT-SUPERCLASS #S(CLASS
:DIRECT-SUPERCLASS NIL
:DIRECT-SLOTS NIL)
:DIRECT-SLOTS (NAME ADDRESS))
:DIRECT-SLOTS (EMPLOYER))
:SLOTS #<HASH-TABLE :TEST EQL :COUNT 3 {1003932403}>)
#S(OBJECT
:CLASS #S(CLASS
:DIRECT-SUPERCLASS #S(CLASS
:DIRECT-SUPERCLASS NIL
:DIRECT-SLOTS NIL)
:DIRECT-SLOTS (SPORTS))
:SLOTS #<HASH-TABLE :TEST EQL :COUNT 1 {1003932853}>))
结果(打印(值列表参数))
#S(OBJECT
:CLASS #S(CLASS
:DIRECT-SUPERCLASS #S(CLASS
:DIRECT-SUPERCLASS #S(CLASS
:DIRECT-SUPERCLASS NIL
:DIRECT-SLOTS NIL)
:DIRECT-SLOTS (NAME ADDRESS))
:DIRECT-SLOTS (EMPLOYER))
:SLOTS #<HASH-TABLE :TEST EQL :COUNT 3 {1003932403}>)
如您所见,values-list 仅获取第一个对象,并使我期望两个对象的函数都失败。
【问题讨论】:
-
您希望
values-list做什么? -
例如,(+ (values-list '(1 2))) 应该给我 3。这是我的想法,但我给了我 1
-
...它为什么要这样做?我不认为
+对多值有什么特别的作用。 -
令我震惊。我在stackoverflow.com/questions/8243813/… 看到它。以为我可以用它实现“ (+ (values-list '(1 2))) = 3”。我可以使用什么来动态检索列表的所有元素并将它们作为单个元素传递给函数?
-
我想你想要
apply,而不是funcall。
标签: common-lisp