1

我很好奇如何

(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”没有相应的打印参数。

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

4

2 回答 2

3

你可以用apply这个。它将传递的函数作为其第一个参数,并将其应用于由其他参数构造的参数。例如,(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))))
于 2013-07-28T19:53:24.317 回答
0

正如塞缪尔所说,您需要使用APPLY.

另请注意,NIL对于流 in执行的WRITE操作不是 in FORMAT。使用FORMAT流参数NIL会导致输出作为字符串返回。与 man 其他输出功能一样WRITE,它意味着标准输出

于 2013-07-28T20:20:35.773 回答