如果获得某个值,如何在LISP中中断函数执行?
例如,我有一个这样的主要功能:
(defun recognize-a (arg input)
(if (equal (recognize-b arg input) '())
T
NIL
))
我希望在输入为空列表的情况下中断函数recognize-b
,而不将任何值传递给main函数:
(defun recognize-b (fa input)
(if (equal input '())
<<<WANTED BREAK>>>
(<Else branch>)))
答案 0 :(得分:6)
当RECOGNIZE-B
为空时,您可以使用ERROR
来表示来自INPUT
的错误。
(defun recognize-b (arg input)
(when (emptyp input)
(error "INPUT is empty!"))
;; Do whatever the function normally does...
:return-value-from-b)
我只会返回:RETURN-VALUE-FROM-B
,因为我不知道该函数应该做什么。您可以定义要发信号的错误类型,但默认情况下ERROR
会发出SIMPLE-ERROR
信号。
要处理RECOGNIZE-A
中的错误,您可以使用HANDLER-CASE
。
(defun recognize-a (arg input)
(handler-case (recognize-b arg input)
(simple-error () t)))
如果没有错误,则只返回RECOGNIZE-B
的值,如果有错误,则返回T
。
(recognize-a 10 '(1 2)) ;=> :RETURN-VALUE-FROM-B
(recognize-a 10 '()) ;=> T
书中Practical Common Lisp,Chapter 19. Beyond Exception Handling: Conditions and Restarts对条件系统有了很好的介绍。