我很好奇
(write
(make-instance 'simple-error
:format-control "A:~a ~% B:~a~%"
:format-arguments `("A" "B"))
:stream nil)
工作,因为我试图自己实现它以获得基本的lisp功能的经验,但很快就意识到,我无法做到。作为直观的实施方式:
(defmethod my-write ((simple-error err))
(FORMAT nil (if (simple-condition-format-control err)
(simple-condition-format-control err)
"")
(simple-condition-format-arguments err)))
显然无法工作,因为(simple-condition-format-arguments err)
返回参数列表,因此,在上面的示例中," B:~a"没有相应的参数可供打印。
那我该如何实际实现这个方法呢?
答案 0 :(得分:3)
您可以使用apply
。它将函数作为第一个参数传递,并将其应用于从其他参数构造的参数。例如,(apply #'f 1 2)
调用(f 1 2)
,(apply #'f 1 '(2 3))
调用(f 1 2 3)
,依此类推。它非常适合这种情况。
SBCL与a function几乎完全相同:
(defun simple-condition-printer (condition stream)
(let ((control (simple-condition-format-control condition)))
(if control
(apply #'format stream
control
(simple-condition-format-arguments condition))
(error "No format-control for ~S" condition))))
答案 1 :(得分:0)
如Samuel所述,您需要使用APPLY
。
另请注意,NIL
中的流WRITE
除了FORMAT
之外还有其他功能。使用FORMAT
,流参数NIL
会使输出作为字符串返回。对于man其他输出函数,例如WRITE
,它意味着标准输出。