Fre*_*d_2 1 lisp common-lisp break
如果获得某个值,如何在LISP中中断函数执行?
例如,我有一个这样的主要功能:
(defun recognize-a (arg input)
(if (equal (recognize-b arg input) '())
T
NIL
))
Run Code Online (Sandbox Code Playgroud)
我希望recognize-b在输入为空列表的情况下中断函数,而不将任何值传递给main函数:
(defun recognize-b (fa input)
(if (equal input '())
<<<WANTED BREAK>>>
(<Else branch>)))
Run Code Online (Sandbox Code Playgroud)
您可以用来ERROR从空RECOGNIZE-B时发出错误信号INPUT.
(defun recognize-b (arg input)
(when (emptyp input)
(error "INPUT is empty!"))
;; Do whatever the function normally does...
:return-value-from-b)
Run Code Online (Sandbox Code Playgroud)
我只是回来,:RETURN-VALUE-FROM-B因为我不知道该功能应该做什么.您可以定义要发出信号的错误类型,但默认情况下ERROR会发出信号a SIMPLE-ERROR.
要处理错误RECOGNIZE-A,您可以使用HANDLER-CASE.
(defun recognize-a (arg input)
(handler-case (recognize-b arg input)
(simple-error () t)))
Run Code Online (Sandbox Code Playgroud)
RECOGNIZE-B如果没有错误,或者T如果有错误,则只返回值.
(recognize-a 10 '(1 2)) ;=> :RETURN-VALUE-FROM-B
(recognize-a 10 '()) ;=> T
Run Code Online (Sandbox Code Playgroud)
在Practical Common Lisp,第19章中,对条件系统有一个很好的介绍.超越异常处理:条件和重新开始.