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また、 for ストリーム inWRITEは in 以外のことを行うことに注意してくださいFORMATFORMATstream 引数を使用NILすると、出力が文字列として返されます。のような他の多くの出力関数では、標準出力WRITEを意味します。

于 2013-07-28T20:20:35.773 に答える