所以考慮下面的代碼:HANDLER-CASE替代它不是宏觀
(define-condition some-condition (error) nil)
(defmethod print-object ((obj some-condition) stream)
(format stream "HELLO THERE"))
(defmacro error-report-test-aux (fn-to-cause-error error-type-to-catch fn-to-handle-error expected-message)
`(let ((result-message
(handler-case (funcall ,fn-to-cause-error)
(,error-type-to-catch (e) (funcall ,fn-to-handle-error e)))))
(assert (string= result-message
,expected-message))
t))
我可以用它像這樣:
(error-report-test-aux (lambda() (error 'some-condition))
some-condition
#'princ-to-string
"HELLO THERE")
但我想讓error-report-test-aux
一個函數,而不是宏,這樣我就可以在變量中傳遞一個條件類型。
要簡單地寫defun
,而不是defmacro
並刪除反引號和逗號不起作用,因爲handler-case
是宏觀,它不評估error-type-to-catch
。
我的問題是:有沒有像handler-case
那樣會評估它的參數(特別是條件類型參數)?
我不認爲將'nil'作爲'stream'傳遞給'print-object'是符合規範的代碼。你可能打算在那裏使用'princ-to-string'而不是'lambda'。 – sds
你可以嘗試用'HANDLER-BIND'爲任何'CONDITION'建立一個處理程序,在那裏你檢查條件是否是正確的類型,如果不正確則拒絕處理。 – jkiiski
@sds您的評論讓我讀了一堆CLHS。現在我知道更多,謝謝。 –