如何在任意点退出函数,在elisp中

时间:2013-04-27 05:13:43

标签: function emacs elisp exit

这是一个简单的问题,但不知怎的,我无法通过谷歌搜索找到答案:

如果不满足某些条件,如何在任意执行点退出函数。例如(我在这里使用“(exit)”代替):

(defun foo ()
  (progn (if (/= a1 a2)
             (exit) ; if a1!=a2, exit the function somehow
           t)
         (blahblah...)))

4 个答案:

答案 0 :(得分:12)

在elisp中,您可以使用catchthrow 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"))