Common lisp write如何利用简单错误中包含的格式参数

Common lisp write如何利用简单错误中包含的格式参数,common-lisp,Common Lisp,我很好奇怎么做 (write (make-instance 'simple-error :format-control "A:~a ~% B:~a~%" :format-arguments `("A" "B")) :stream nil) 当我试图自己实现它以获得基本lisp函数性方面的经验时,我很快就意识到,我不能。作为直观的实施方式: (defmethod my-write ((simple-error

我很好奇怎么做

(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)))
显然无法工作,因为
(简单条件格式参数错误)
返回参数列表,因此在上面的示例中,“B:~a”没有相应的参数可打印

那么我该如何实际实现这个方法呢?

您可以使用它。它将传递的函数作为其第一个参数,并将其应用于由其他参数构造的参数。例如,
(apply#'f 1 2)
调用
(f 1 2)
(apply#'f 1'(2 3))
调用
(f 1 2 3)
等等。它非常适合这种情况

SBCL与您的几乎相同:

(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))))

正如Samuel所提到的,您需要使用
APPLY

还请注意,
WRITE
中的流的
NIL
执行的不是
格式的操作。使用
FORMAT
时,流参数
NIL
使输出作为字符串返回。对于其他输出函数,如
WRITE
,它表示标准输出