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
,它表示标准输出