11

これは簡単な質問ですが、どういうわけかグーグルで答えを見つけることができませんでした:

何らかの条件が満たされない場合、実行の任意の時点で関数を終了するにはどうすればよいですか。例 (ここでは "(exit)" を代わりに使用します):

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

4 に答える 4

13

elispでは、cl のandcatchの代わりにandを使用できます。throw blockreturn-from

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

見るC-hig (elisp) Nonlocal Exits RET

于 2013-04-27T06:30:49.420 に答える
10

体の周りにブロックを置き、そこから戻ります。

(require 'cl-macs)
(defun foo ()
  (block foo
    (if (/= a1 a2)
        (return-from foo)
        reture-value))))
于 2013-04-27T05:44:52.450 に答える
9

(パッケージに付属)defun*の代わりに使用するだけです。このマクロはすでに Common Lisp のように動作します (関数の本体を try-catch ブロックでラップし、エイリアスなどを作成します)。defuncldefunreturn-fromthrow

例えば:

(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))
于 2013-04-27T07:56:13.123 に答える
3

関数は、最後に評価されたフォームの値を返します。値が何であるかを気にしない場合は、nil候補になる可能性があります。この場合、関数は関数の値を返しますif

例えば:

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

この簡単な例では、これらも同等です。

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

(defun foo ()
  (when (not (/= a1 a2))
    "return-value"))
于 2013-04-27T05:54:41.047 に答える