Как выйти из функции в любой произвольной точке, в elisp

Это простой вопрос, но почему - то я не мог найти ответ в гугле:

Как выйти из функции в любой произвольной точке выполнения, если какое-либо условие не выполнено. Например (я использую "(выход)" в качестве замены здесь):

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

4 ответов


в elisp, вы можете использовать catch и throw вместо cl block и return-from.

(defun foo ()
  (catch 'my-tag
    (when (not (/= a1 a2))
      (throw 'my-tag "non-local exit value"))
    "normal exit value"))

посмотреть C-hЯg (elisp) Nonlocal Exits RET


положите блок вокруг тела и вернитесь от него:

(require 'cl-macs)
(defun foo ()
  (block foo
    (if (/= a1 a2)
        (return-from foo)
        reture-value))))

просто использовать defun* вместо defun (входит ). Этот макрос уже действует как общий Лисп это defun (обертывает тело функции в блок try-catch и псевдонимы return-from to throw etc.).

например:

(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))

функция возвращает значение последней вычисленной формы. Если вам все равно, какое значение, то nil был бы вероятным кандидатом. В этом случае функция возвращает значение .

например:

(defun foo ()
  (if (/= a1 a2)
      nil
    "return-value"))

в этом тривиальном примере, они могут быть эквивалентны:

(defun foo ()
  (if (not (/= a1 a2))
      "return-value"))

(defun foo ()
  (when (not (/= a1 a2))
    "return-value"))