LISP打破了函数执行

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)

jki*_*ski 6

您可以用来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章中,对条件系统有一个很好的介绍.超越异常处理:条件和重新开始.