Как выйти из функции в любой произвольной точке, в 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"))