2013-04-27 9 views
10

Questa è una domanda semplice, ma in qualche modo non ho potuto trovare una risposta googling:Come uscire da una funzione in qualsiasi punto arbitrario, in elisp

Come si esce da una funzione in qualsiasi punto arbitrario di esecuzione , se alcune condizioni non sono soddisfatte. Per esempio (io uso "(uscita)" come sostituto qui):

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

risposta

11

In elisp, è possibile utilizzare catch e throwinstead 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")) 

Vedi C-hig(elisp) Nonlocal ExitsRET

9

mettere un blocco intorno al corpo e ritorno da esso:

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

Non sapevo blocco. +1 – RNA

3

Una funzione restituisce il valore dell'ultimo modulo valutata. Se non ti interessa quale sia il valore, allora nil sarebbe un candidato probabile. In questo caso, la funzione restituisce il valore della funzione if.

es .:

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

In questo esempio banale, questi sarebbero anche come equivalenti:

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

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

: Questa non è la mia domanda. scusa, il mio precedente esempio è fuorviante. L'ho cambiato. – RNA

+0

Ah, ok. Nella maggior parte delle situazioni dovresti essere in grado di strutturare il tuo codice in modo da evitare la necessità di uscite non locali, ma ho aggiunto un'altra risposta con l'approccio elisp standard per farlo. – phils

6

Basta usare defun* invece di defun (viene fornito con cl pacchetto). Questa macro agisce già come Common Lisp's defun (racchiude il corpo della funzione in un blocco try-catch e alias return-from in throw ecc.).

Ad esempio:

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