শর্তসাপেক্ষে "এবং" বনাম "কখন"


13

এটি এই উত্তরের মন্তব্যে একটি ফলোআপ । নিম্নলিখিত কোডের বিটগুলি সমতুল্য বলে মনে হচ্ছে:

(and a b)

(when a b)

অবশ্যই andআপনাকে আরও শর্ত রাখতে দেয়: (and a b c d)মানে(when (and a b c) d)

আমি whenকেবল শাখা প্রকাশের জন্য ব্যবহার করার প্রবণতা রাখি । বাস্তব পার্থক্য আছে? একটি বা অন্য ব্যবহার করা ভাল?

আমি হাতে Emacs 'সি উত্স নেই; andএকটি সি ফাংশন; whenএকটি ম্যাক্রো যা প্রসারিত হয় if, যা নিজেই একটি সি ফাংশন।


"অবশ্যই এবং লেটস" হ'ল "অবশ্যই` এবং` লেটস "হওয়া উচিত তবে এটি কেবল একটি 2 চরিত্রের পরিবর্তন এবং এটি অনুমোদিত অনুমতি নয়। কোনও ওভাররাইড নেই।
হার্ভে

উত্তর:


18

টিএল; ডিআর: when পার্শ্ব প্রতিক্রিয়া সম্পর্কে, andখাঁটি বুলিয়ান এক্সপ্রেশনগুলির জন্য।

যেমন আপনি লক্ষ্য করেছেন, andএবং whenকেবল বাক্য গঠনতে পৃথক, তবে অন্যথায় সম্পূর্ণ সমতুল্য।

সিনট্যাক্টিক পার্থক্যটি বেশ গুরুত্বপূর্ণ, যদিও: প্রথম যুক্তি ফর্ম ব্যতীত সমস্ত চারদিকে whenএকটি অন্তর্নিহিত আবৃত prognprognএটি স্বভাবগতভাবে অপরিহার্য বৈশিষ্ট্য: এটি কেবলমাত্র তাদের পার্শ্ব প্রতিক্রিয়াগুলির জন্য কেবলমাত্র সর্বশেষ শরীরের ফর্মটি মূল্যায়ন করে, তারা যে পরিমাণ মান ফিরে আসে তা ত্যাগ করে।

যেমন, whenপাশাপাশি একটি আবশ্যকীয় রূপ: এটির মূল উদ্দেশ্যটি পার্শ্ব-প্রতিক্রিয়াশীল ফর্মগুলি মোড়ানো because কারণ কেবলমাত্র শেষ আকারের মূল্যই দেহের পক্ষে গুরুত্বপূর্ণ।

andঅন্যদিকে একটি খাঁটি ফাংশন, যার মূল উদ্দেশ্য প্রদত্ত আর্গুমেন্ট ফর্মগুলির রিটার্ন মানগুলি পর্যালোচনা করা: আপনি যদি prognতার যুক্তিগুলির কোনওটির চারপাশে পরিষ্কারভাবে আবদ্ধ না করেন তবে প্রতিটি আর্গুমেন্টের ফর্মের মান গুরুত্বপূর্ণ, এবং কোনও মান কখনই উপেক্ষা করা হবে না ।

তাই, মধ্যে আসল পার্থক্যটা andএবং whenরচনাশৈলীসংক্রান্ত হল: আপনি এই ব্যবহার andবিশুদ্ধ বুলিয়ান এক্সপ্রেশন জন্য, এবং whenপ্রায় পার্শ্ব-effecting ফরম গার্ড করা।

সুতরাং, এগুলি খারাপ শৈলী:

;; `when' used for a pure boolean expression
(let ((use-buffer (when (buffer-live-p buffer)
                    (file-exists-p (buffer-file-name buffer)))))
  ...)

;; `and' used as guard around a side-effecting form
(and (buffer-file-name buffer) (write-region nil nil (buffer-file-name buffer)))

এবং এগুলি ভাল:

(let ((use-buffer (and (buffer-live-p buffer)
                       (file-exists-p (buffer-file-name buffer)))))
  ...)

(when (buffer-file-name buffer)
 (write-region nil nil (buffer-file-name buffer)))

আমি জানি যে কিছু লোক এ সম্পর্কে মতভেদ করে না, এবং আনন্দের andসাথে পার্শ্ব প্রতিক্রিয়া রক্ষা করতে ব্যবহার করে তবে আমি মনে করি এটি সত্যই খারাপ শৈলী। আমাদের এই কারণগুলির জন্য এই বিভিন্ন ফর্ম রয়েছে: সিনট্যাক্স বিষয় । যদি এটি না হয়, আমরা কেবলমাত্র সবসময়ই ব্যবহার করতাম if, যা কেবলমাত্র ইমাস লিস্পে শব্দার্থগতভাবে আপনার প্রয়োজন কেবলমাত্র শর্তযুক্ত ফর্ম। অন্যান্য সমস্ত বুলিয়ান এবং শর্তসাপেক্ষিক ফর্মগুলির নিরিখে লেখা যেতে পারে if


2
আইএমও (যেমন, আমি যে স্টাইলটি ব্যবহার করি), andতা রিটার্নের মান সম্পর্কে যত্নশীল । পার্শ্ব প্রতিক্রিয়া ব্যবহার সম্পর্কে এটি অগত্যা নয়। যদি আমার প্রোগ্রামটি ফেরতের মান সম্পর্কে চিন্তা করে তবে আমি ব্যবহার করি and। যদি তা না হয় তবে আমি ব্যবহার করি when। আইওডাব্লু, আমি when কেবলমাত্র পার্শ্ব প্রতিক্রিয়াগুলির জন্যই ব্যবহার করি prognতবে এর মধ্যে একটিতে আমি একটি যুক্তিটি ভালভাবে ব্যবহার করতে পারি and। এটি রিটার্নের মূল্য গুরুত্বপূর্ণ কিনা তা নিয়ে নয়, এটি একাকী গুরুত্বপূর্ণ কিনা তা নয়
ড্র হয়েছে

5
andআমার জানা কোনও লিস্পে এটি কোনও ফাংশন নয়। ইমাস লিস্পে এটি একটি বিশেষ ফর্ম, কমন লিস্পে এটি একটি ম্যাক্রো, এটির কারণেই এটির শর্ট সার্কিট আচরণ (ফাংশনগুলির সাথে অর্জন করা অসম্ভব, কারণ তারা সর্বদা তাদের যুক্তিগুলি মূল্যায়ন করে) to
মার্ক কার্পভ

2
@ লুনারিয়র্ন, হ্যাঁ, এটি সত্যিই প্রাসঙ্গিক নয়, তবে এটি সত্য, তাই আমি মনে করি যে andএটি কোনও ফাংশন, যখন তা না হয় লিখতে ভুল । প্রশ্নের সাথে সত্যটি কতটা প্রাসঙ্গিক তা বিবেচনাধীন নয়, আমাদের সর্বদা সঠিক পদ ব্যবহার করা উচিত, এটাই সব।
মার্ক কার্পভ

2
ভাল, আমি মনে করি না "প্রতিটি যুক্তি ফর্মের মূল্য গুরুত্বপূর্ণ" সেই ব্যাখ্যাটির সাথে সামঞ্জস্যপূর্ণ। এটি আরও ভালভাবে প্রকাশ করে বলা যেতে পারে যে কোনও ফর্মের মূল্য নির্ধারণ করা হয় কেবল তার মান ফেলে দেওয়া হয়।
হ্যারাল্ড হানচে-ওলসেন

3
কিছুটা ওটি, তবে: পার্থক্যটি লিস্পসের স্টাইলিস্টিকের চেয়ে বেশি যা nil"মিথ্যা", "খালি তালিকা", "শূন্য" ইত্যাদির অর্থ বোঝাতেই পাঞ্জা দেয় না উদাহরণস্বরূপ স্কিম এবং র‌্যাকেটে অ-সত্যবাদী ফলাফলের জন্য whenএটি void(অর্থাত্ "অর্থ নয়") তবে andএটির জন্য #f("মিথ্যা")। যদিও এটি এলিস্পের জন্য এন / এ, এটি লিস্প জেনারালিস্ট বিবেচনা করতে পারে এমন কিছু।
গ্রেগ হেন্ডারশট

4

আমাকে এই বলে (and a b)আর (when a b)আপনার উদাহরণে একই জিনিসটি করা শুরু করুন: প্রথমে aমূল্যায়ন করা হয়। bযদি সত্য হয় তবে মূল্যায়ন করা aহয় #

কিন্তু and এবং whenবিভিন্ন জিনিস জন্য ব্যবহৃত হয়।

  • আপনি ব্যবহার করেন (and a b)ফিরতে সত্য # উভয় aএবং bহয় সত্য # (বা অ শূন্য); এবং nilঅন্যথায়।

  • আপনি ব্যবহার করতে (when a b)বা আরও সঠিক হতে হবে,

    (when a
       ;; do something like b
       )
    

    যখন আপনি "B" কোড এক্সিকিউট করতে চান যদি এবং কেবল যদি aহয় সত্য #


আপনি যেখানে ব্যবহার করেন whenএবং andএকসাথে এখানে একটি উদাহরণ এখানে দেওয়া হয়েছে :

(when (and a b)
   (do-c))

সর্বোপরি, ফাংশন do-cশুধুমাত্র যদি উভয় বলা হয় aএবং bহয় সত্য #


অধ্যয়নের জন্য রেফারেন্স

# সত্যের সমস্ত উল্লেখ বুলিয়ান সত্যকে উল্লেখ করে।


3
andএর tসমস্ত যুক্তি যদি অ-শূন্য হয় তবে ফিরে আসে না , তবে শেষ যুক্তির মান।
অর্থবহ ব্যবহারকারীর নাম 17

1
দ্বারা t, আমি বুলিয়ান সত্য বা নন শূন্য বোঝাতে চাইছি। ধন্যবাদ, আমি আমার উত্তরে এটি স্পষ্ট করব।
দক্ষ মোদী

আমি মনে করি না যে আপনার উত্তরটি আরও বেশি এগিয়ে যায় যা আমি ইতিমধ্যে প্রশ্নে বলেছি; আমি উভয়ই জানি এবং আপনি যে চূড়ান্ত উদাহরণটি দিয়েছেন তা আমার প্রশ্নে ( (when (and a b) c)) ইতিমধ্যে উপস্থিত রয়েছে । এছাড়াও, অংশটি কীভাবে andএবং whenপরামর্শ দেয় যে এগুলি আসলে কীভাবে তারা সাধারণভাবে ব্যবহৃত হয় তবে এই প্রশ্নের মূল ভিত্তিটি হ'ল আমি প্রায়শই তাদের আলাদাভাবে দেখি (উদাহরণস্বরূপ আমার প্রশ্নের সাথে যুক্ত উত্তরটি দেখুন)।
ক্লাইমেন্ট

একটি সম্পূর্ণরূপে কার্যক্ষম কনস্ট্রাক্ট পয়েন্ট অফ ভিউ থেকে, যখন অ-সমাপ্তি মূল্যায়নের জন্য হয় এবং এটি সরাসরি প্রতীক এবং বুলিয়ান যুক্তির জন্য। ক্রিয়ামূলক প্রোগ্রামিংয়ের এই স্বাতন্ত্র্য প্রয়োজন; অত্যাবশ্যক প্রোগ্রামিং এ দূরে fudge।
ইমাক্স ব্যবহারকারী

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