LISP打破了函数执行

时间:2017-07-23 10:05:45

标签: lisp common-lisp break

如果获得某个值,如何在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>)))

1 个答案:

答案 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 LispChapter 19. Beyond Exception Handling: Conditions and Restarts对条件系统有了很好的介绍。