2013-04-27 24 views
10

Bu basit bir soru, ama bir şekilde ben googling tarafından bir cevap bulamadık içinde, herhangi bir keyfi noktada bir işlevinden çıkmak için: Nasıl yürütme herhangi bir keyfi noktada bir işlevi çıkmak yoknasıl elisp

Bazı şartlar yerine getirilmemişse. Örneğin (I kullanma burada bir yedek olarak "(çıkış)") için:

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

cevap

11

, sen catch ve throwinstead of cl's block and return-from kullanabilirsiniz.

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

Cı-sigr(elisp) Nonlocal ExitsRET

9

gövdesinin etrafında bir blok koyun ve dönmek:

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

Ben bloğu bilmiyordum. +1 – RNA

3

bir fonksiyon son formun değerini verir değerlendirdi. Değerin ne olduğu umrumda değilse, o zaman nil olası bir aday olacaktır. Bu durumda, işlev if işlevinin değerini döndürür.

ör .: Bu basit örnekte

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

, bunlar da eşdeğer olacaktır: elisp olarak

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

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

: Bu benim sorum değil. Üzgünüm, önceki örneğim yanıltıcıdır. Ben değiştirdim. – RNA

+0

Ah, tamam. Durumların çoğunda, yerel olmayan çıkışlara olan gereksinimden kaçınmak için kodunuzu yapılandırabilmeniz gerekir, ancak bunu yapmak için standart elisp yaklaşımı ile başka bir cevap ekledim. – phils

6

sadece defun* yerine defun (cl paketi ile birlikte) kullanma. Bu makro zaten Common Lisp'in defun gibi davranır (işlevin gövdesini bir try-catch bloğuna ve return-from ile throw arasındaki takma adlara kaydırır.). Örneğin

:

(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)) 
İlgili konular