Ptionচ্ছিক পরামিতি ডিফল্ট


26

Maচ্ছিক পরামিতিগুলির নন-শিল ডিফল্টদের জন্য ইমাস লিস্পের সিনট্যাক্টিক্যাল সমর্থন নেই। এই পরামিতি সরবরাহের জন্য প্রস্তাবিত প্রতিমাটি কী?

আমার বক্তব্য পরিষ্কার করার জন্য, এটি করার একটি অত্যধিক স্পষ্ট উপায় way

(defun command (a &optional supplied-b)
  (let ((b (or supplied-b default-b)))
    (command-body a b)))

কী, যদি কিছু থাকে তবে প্রস্তাবিত স্টাইলটি কী?

উত্তর:


24

আপনি @ গ্রেগাসিয়ার পরামর্শ অনুসারে কমন লিস্প এক্সটেনশনগুলি ব্যবহার না করে youচ্ছিক যুক্তি সুনির্দিষ্ট করা হয়েছে কিনা তা আপনার খতিয়ে দেখার দরকার। মনে রাখবেন যে এখানে আপনার সত্যিই ব্যবহারের দরকার letনেই। এটি আমার কাছে আরও মূর্খ বলে মনে হচ্ছে:

(defun command (a &optional b)
  (or b (setq b default))
  (command-body a b))

মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, unlessতেমন ব্যবহার করা ভাল or:

(defun command (a &optional b)
  (unless b (setq b default))
  (command-body a b))

এছাড়াও মন্তব্যগুলি থেকে: letমূল প্রশ্নের মতো আরও খাঁটি কার্যকরী শৈলীটি ব্যবহার করা হবে তবে আপনার পৃথক ভেরিয়েবলের প্রয়োজন নেই:

(defun my-command (a &optional b)
  (let ((b (or b default)))
    (command-body a b)))

অবশ্যই, যদি onceচ্ছিক প্যারামিটারটি কেবল একবার প্রয়োজন হয় আপনার কেবল এটি করা উচিত:

(defun my-command (a &optional b)
    (command-body a (or b default)))

7
-1: আমি মনে করি না যে setq"খাঁটি" বুলিয়ান ফর্মের মতো পার্শ্ব-প্রতিক্রিয়াযুক্ত এক্সপ্রেশনটি ব্যবহার করা ভাল স্টাইল or। আমার মতে whenএখানে অবশ্যই আরও উপযুক্ত, তবে সাধারণত letস্থানীয় বাইন্ডিংগুলি স্থাপন বা পরিবর্তন করতে পছন্দমত প্রকাশ। IOW, মূল কোডটি আমার কাছে অনেক সুন্দর দেখাচ্ছে much
চন্দ্রাহীন

3
আমি সম্মত যে এর মত কিছু (unless b (setq b default)ভাল হতে পারে। ব্যক্তিগতভাবে, আমি মনে করি letএখানে অপ্রয়োজনীয় কারণ bইতিমধ্যে স্থানীয় হয় defun
গ্লুকাস

3
এটি স্বাদের বিষয়, তবে আমি খাঁটি কোড এবং খাঁটি বাঁধাই পছন্দ করি, যেমন letপার্শ্ব-প্রভাবপূর্ণ ফর্মের চেয়ে বেশি setq। এটি প্যারামিটার ডিফল্টের জন্য কোড, তবে setqস্থানীয় ভেরিয়েবলগুলি পরিবর্তন করতে উদার ব্যবহার কোডটি পড়া এবং অনুসরণ করা শক্ত করে। আমি মনে করি সমস্ত স্থানীয় বাইন্ডিংগুলি অপরিবর্তনীয় বিবেচনা করা এবং কেবলমাত্র নতুন বাইন্ডিংগুলির সাথে এটি স্থাপন করা ভাল let। আইওডাব্লু, একটি অপরিহার্য একটির চেয়ে কার্যকরী শৈলী পছন্দ করুন।
লুনারিওর

22

আপনি ব্যবহার করতে পারেন cl-defun, যা আপনাকে alচ্ছিক আর্গুমেন্টগুলির জন্য একটি ডিফল্ট মান নির্দিষ্ট করতে দেয়:

(cl-defun command (a &optional (b default-b))
  (command-body a b))

ডিফল্ট মান, এক্ষেত্রে, default-bপ্রতিটি বার ফাংশনটি ডাকা হলে তা মূল্যায়ন করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.