আপনি কিভাবে একটি স্বেচ্ছাসেবী বিন্দু থেকে একটি ফাংশন থেকে ফিরে?


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

CL-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

@ ইমাসফসফডার কভার করেছেন তা ছাড়াও, কেবল একটি ত্রুটি বাড়ান।

কোডটি যদি (ডায়নামিকভাবে, লেজিকভাবে নয়) ত্রুটি-পরিচালনা পরিচালনার পরিমাণ ignore-errorsবা যেমন এর মধ্যে কল করা হয় তবে এটি সাহায্য করবে না condition-case, তবে অন্যথায় এটি কোনও ফাংশন থেকে বেরিয়ে আসার একটি দুর্দান্ত উপায়। এটি আসলে বেশিরভাগ সময়ই করা হয়।

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

যদি আপনি নিজেই ত্রুটিটি পরিচালনা করতে চান তবে আপনি ক এর মধ্যে কলিং কোডটি (যেমন কলকে এমন কিছুকে কল করুন my-func) রাখতে পারেন condition-case। আবার, এই কি ব্যবহার হিসাবে হিসাবে প্রায়ই, বেশির ভাগ সময়ে সম্পন্ন করা হয় অন্তত হয় catch+ + throw। এটি আপনার কী আচরণ চান তা নির্ভর করে।


উত্তর উত্তর এর জন্য ধন্যবাদ, আমি সম্মত এটি বেশ একটি সাধারণ পদ্ধতি। যাইহোক, কেবলমাত্র অন্যান্য অনেক ভাষায় প্রথম দিকে রিটার্ন করা, ত্রুটি মোকাবেলা করার জটিলতায় জড়িত না । প্রশ্ন / উত্তর সেট গবেষণা করার সময়। আমি বিশেষত "ত্রুটিযুক্ত" শৈলীর বিকল্প খুঁজছিলাম যা সর্বদা আমার কাছে ক্লডজি বোধ করে। আপনার মনে মনে প্রশ্ন প্রবন্ধে আমি এটি স্পষ্টভাবে উল্লেখ করিনি।
ocodo

1
এটি সমস্ত কি আপনি করতে চান তার উপর নির্ভর করে। আপনি যদি আর কোনও প্রক্রিয়াজাতকরণ / পরিচালনা না করে অবিলম্বে শেষ করতে চান তবে ইমাসে নোনলোকাল প্রস্থান করার জন্য একটি ত্রুটি বাড়ানো ভাল উপায়। আপনি যদি একটি nonlocal প্রস্থান সময় কিছু করতে, অর্থাত্ চান, কোনো না কোনোভাবে এটি পরিচালনা তারপর catch, unwind-protect, condition-caseমত দরকারী। এলিসপ ম্যানুয়ালটির পুরো বিভাগ রয়েছে ননলোকাল প্রস্থানগুলিতে নিবেদিত । (এবং এর মধ্যে আইএমও-র কোনও সম্পর্কেই বিশেষ জঘন্য কিছু নেই))
ড্রু

"অনুভূতি" অবশ্যই সম্পূর্ণরূপে বিষয়গত। ননলোকাল ম্যানুয়াল রেফের জন্য ধন্যবাদ।
ocodo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.