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

时间:2013-07-28 19:40:09

标签: 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 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"没有相应的参数可供打印。

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

2 个答案:

答案 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,它意味着标准输出