2013-04-27 10 views
10

Dies ist eine einfache Frage zu beenden, aber irgendwie konnte ich keine Antwort von googeln finden:Wie aus einer Funktion an jedem beliebigen Punkt in elisp

Wie beenden Sie eine Funktion an jedem beliebigen Punkt der Ausführung , wenn eine Bedingung nicht erfüllt ist. Zum Beispiel (ich benutze „(Ausgang)“ als Ersatz hier):

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

Antwort

11

In elisp Sie catch und throwinstead of cl's block and return-from verwenden können.

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

Siehe C-hig(elisp) Nonlocal ExitsRET

9

Setzen Sie einen Block um den Körper und zurück von ihm:

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

Ich weiß nicht blockieren. +1 – RNA

3

Eine Funktion, um den Wert der letzten Form zurückkehrt bewertet. Wenn es Ihnen egal ist, was der Wert ist, dann wäre nil ein wahrscheinlicher Kandidat. In diesem Fall gibt die Funktion den Wert der Funktion if zurück.

z.B .:

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

In diesem trivialen Beispiel würden diese auch gleich sein:

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

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

: Das ist nicht meine Frage. Entschuldigung, mein vorheriges Beispiel ist irreführend. Ich habe es geändert. – RNA

+0

Ah, okay. In den meisten Situationen sollten Sie in der Lage sein, Ihren Code so zu strukturieren, dass nicht-lokale Exits vermieden werden, aber ich habe eine weitere Antwort mit dem Standard-elisp-Ansatz hinzugefügt. – phils

6

Verwenden Sie einfach defun* statt defun (kommt mit cl Paket). Dieses Makro verhält sich bereits wie Common Lisp defun (Wraps den Körper der Funktion in einem try-catch-Block und Aliase return-from zu throw usw.).

Zum Beispiel:

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