这是一个简单的问题,但不知怎的,我无法通过谷歌搜索找到答案:
如果不满足某些条件,如何在任意执行点退出函数。例如(我在这里使用“(exit)”代替):
(defun foo ()
(progn (if (/= a1 a2)
(exit) ; if a1!=a2, exit the function somehow
t)
(blahblah...)))
答案 0 :(得分:12)
在elisp中,您可以使用catch
和throw
instead of cl's block
and return-from
。
(defun foo ()
(catch 'my-tag
(when (not (/= a1 a2))
(throw 'my-tag "non-local exit value"))
"normal exit value"))
参见 C-h i g (elisp) Nonlocal Exits
RET
答案 1 :(得分:9)
在身体周围放一块并从中返回:
(require 'cl-macs)
(defun foo ()
(block foo
(if (/= a1 a2)
(return-from foo)
reture-value))))
答案 2 :(得分:8)
只需使用defun*
代替defun
(附带cl
包)。这个宏的行为类似于Common Lisp的defun
(在try-catch块中包含函数体,并将return-from
别名为throw
等。)。
例如:
(require 'cl)
(defun* get-out-early ()
"Get out early from this silly example."
(when (not (boundp some-unbound-symbol))
(return-from get-out-early))
;;
;; Get on with the func...
;;
(do-such-and-such with-some-stuff))
答案 3 :(得分:3)
函数返回最后评估的表单的值。如果您不关心价值是什么,那么nil
可能是候选者。在这种情况下,函数返回if
函数的值。
e.g:
(defun foo ()
(if (/= a1 a2)
nil
"return-value"))
在这个简单的例子中,这些也是等价的:
(defun foo ()
(if (not (/= a1 a2))
"return-value"))
(defun foo ()
(when (not (/= a1 a2))
"return-value"))