आप एक मनमाना बिंदु पर एक समारोह से कैसे लौटते हैं?


12

समाप्त होने से पहले आप किसी फ़ंक्शन से जल्दी कैसे लौटते हैं? उदाहरण के लिए:

(defun my-func () 
 "for example."
 (unless something (return nil))
 ; continue as usual...
 (+ 42 1))

जवाबों:


19

हमारे पास कई विकल्प उपलब्ध हैं।

फेंकना

आप कर सकते हैं catch/ throwसमारोह बाहर निकलने के लिए।

उदाहरण:

(defun my-func ()
  "thrown error"
  (catch 'my-catch
    (when t
      (throw 'my-catch "always going to throw"))
    (+ 42 1)))

खंड मैथा

आप भी उपयोग कर सकते हैं blockऔर return-from(हालांकि आपको आवश्यकता होगी cl-macs)

उदाहरण:

(require 'cl-macs)

(defun my-func ()
  "block / return-from"
  (block my-func
    (when t
      (return-from my-func))
    (+ 42 1)))

सीएल-defun

हमारे पास फ़ंक्शन के समान नाम के साथ cl-defunएक निहितार्थ भी है block, इसलिए हम blockशैली को कम के साथ कर सकते हैं ।

उदाहरण:

(require 'cl-macs)

(cl-defun my-func ()
  "cl-defun implicit block"
  (when t
    (return-from my-func)) ; my-func is an implicit block.
  (+ 42 1)))

defun *

cl-defunयह उर्फ ​​के रूप में भी उपलब्ध है defun*जो इस प्रकार परिभाषित है cl.el:

(require 'cl)

(defun* my-func ()
  "defun* implicit block"
  (when t
    (return-from my-func)) ; my-func is an implicit block.
  (+ 42 1)))

4
ध्यान दें कि यदि आपके पास सीएल सिंटैक्स के लिए कोई प्राथमिकता नहीं है, catch/ throwतो एलीस्प में अधिक मुहावरेदार है, क्योंकि अन्य दृष्टिकोण अंततः कैच / थ्रो के संदर्भ में लागू होते हैं। Elisp मैनुअल कहते हैं: "लिस्प के अधिकांश अन्य संस्करणों, आम लिस्प सहित nonsequentially नियंत्रण के हस्तांतरण के कई तरीके होते हैं: return, return-from, और go। उदाहरण के लिए, Emacs लिस्प केवल throw।"
फिल्स

5

@EmacsFodder को कवर करने के अलावा, बस एक त्रुटि बढ़ाएं।

यह मदद नहीं करेगा यदि कोड (गतिशील रूप से, शाब्दिक रूप से नहीं) को त्रुटि-हैंडलिंग निर्माणों की सीमा के भीतर ignore-errorsया जैसे कहा जाता है condition-case, लेकिन अन्यथा यह एक फ़ंक्शन से बाहर निकलने का एक अच्छा तरीका है। यह वास्तव में है कि ज्यादातर समय क्या किया जाता है।

(defun my-func () 
 "..."
 (unless something (error "Whoops!"))
 ; continue as usual...
 (+ 42 1))

यदि आप स्वयं त्रुटि को संभालना चाहते हैं, तो आप कॉलिंग कोड (जैसे किसी चीज़ को कॉल करने के लिए, जिसे कॉल करके कॉल कर सकते हैं my-func) को अंदर डाल सकते हैं condition-case। फिर, यह वही है जो ज्यादातर समय किया जाता है, कम से कम जितनी बार catch+ का उपयोग किया जाता है throw। यह सब इस बात पर निर्भर करता है कि आप क्या व्यवहार चाहते हैं।


उत्तर आकर्षित करने के लिए धन्यवाद, मैं मानता हूं कि यह काफी सामान्य तरीका है। हालाँकि, अभी बहुत सी अन्य भाषाओं में जल्द वापसी कर रहे हैं, तो फिर एक त्रुटि से निपटने की जटिलता नहीं है । प्रश्न / उत्तर सेट पर शोध करते समय। मैं विशेष रूप से "इर्रिटिंग आउट" शैली के विकल्पों की तलाश कर रहा था जो हमेशा मेरे लिए कठिन लगता है। मैंने यह स्पष्ट रूप से प्रश्न पाठ मन में निर्दिष्ट नहीं किया है।
ओसोडो

1
यह सब उस पर निर्भर करता है जो आप करना चाहते हैं। यदि आप तुरंत समाप्त करना चाहते हैं, कोई और प्रसंस्करण / हैंडलिंग के साथ नहीं है, तो एक त्रुटि को बढ़ाने के लिए एक अच्छा तरीका है गैर-निकास निकास के लिए, Emacs में। यदि आप एक nonlocal बाहर निकलने के दौरान कुछ करने के लिए, यानी चाहते हैं, किसी तरह से इसे संभाल तो, catch, unwind-protect, condition-caseऔर की तरह उपयोगी होते हैं। नॉनोकॉक निकास के लिए समर्पित एलिसा मैनुअल का एक पूरा खंड है । (और उनमें से किसी के बारे में विशेष रूप से कुछ भी गलत नहीं है, IMO।)
आकर्षित

"फील" पूरी तरह से व्यक्तिपरक है। गैर-मैनुअल मैनुअल रेफरी के लिए धन्यवाद।
ओसोडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.