বেশিরভাগ মূলধারার ভাষাগুলি 3-উপায় বুলিয়ান তুলনার জন্য "x <y <z" বাক্য গঠন সমর্থন করে না কেন?


34

আমি যদি দুটি সংখ্যার (বা অন্যান্য ভাল অর্ডারযুক্ত সত্ত্বাগুলি) তুলনা করতে চাই, আমি এটি দিয়ে করব x < y। আমি যদি তাদের তিনটির তুলনা করতে চাই, তবে উচ্চ বিদ্যালয়ের বীজগণিতের শিক্ষার্থী চেষ্টা করার পরামর্শ দিবে x < y < z। আমার মধ্যে প্রোগ্রামার তারপরে "না, এটি বৈধ নয়, আপনাকে করতে হবে x < y && y < z" দিয়ে প্রতিক্রিয়া জানাবে ।

বেশিরভাগ ভাষাগুলি আমি এসেছি বলে মনে হয় না যে এই সিনট্যাক্সটি সমর্থন করে যা গণিতের ক্ষেত্রে এটি কতটা সাধারণ। পাইথন একটি উল্লেখযোগ্য ব্যতিক্রম। জাভাস্ক্রিপ্টটি একটি ব্যতিক্রমের মতো দেখায় তবে এটি অপারেটর অগ্রাধিকার এবং অন্তর্নিহিত রূপান্তরগুলির সত্যই একটি দুর্ভাগ্যজনক উপ-পণ্য; নোড.জেজেসে 1 < 3 < 2মূল্যায়ন করে true, কারণ এটি সত্যই (1 < 3) < 2 === true < 2 === 1 < 2

সুতরাং, আমার প্রশ্নটি হ'ল: প্রত্যাশিত শব্দার্থক শব্দগুলি সহ কেন x < y < zপ্রোগ্রামিং ভাষায় সাধারণত পাওয়া যায় না?


1
: আমি এটা মনে করি না যে কঠিন - এখানে ব্যাকরণ ফাইল, যা তারা handily পাইথন ডকুমেন্টেশন সঠিক বিদ্ধ এর docs.python.org/reference/grammar.html
হারুন হলের

আমি পাইথনকে জানার পাশাপাশি অন্যান্য ভাষাও জানি না তবে পাইথনের ব্যাখ্যাটির সরলতার সাথে আমি কথা বলতে পারি। সম্ভবত আমার উত্তর দেওয়া উচিত। তবে আমি ক্ষতিগ্রস্থ হওয়ার বিষয়ে gnasher729 এর উপসংহারের সাথে একমত নই।
হারুন হল

@ এরিকইডট - আমাদের উচ্চ বিদ্যালয়ে (বা এর আগে) যেভাবে পড়ানো হয়েছিল সেই দাবিটি গাণিতিক প্রকাশগুলি লিখতে সক্ষম হচ্ছে। গাণিতিকভাবে ঝুঁকে থাকা প্রত্যেকে knows a <b <c <d $ এর অর্থ কী। কেবল কোনও বৈশিষ্ট্য বিদ্যমান থাকার অর্থ এই নয় যে আপনাকে এটি ব্যবহার করতে হবে। যারা এটি পছন্দ করেন না তারা সর্বদা এটির ব্যবহার নিষিদ্ধ একটি ব্যক্তিগত বা প্রকল্পের নিয়ম তৈরি করতে পারেন।
ডেভিড হামেন

2
আমি মনে করি যে এটি নেমে আসে তা হ'ল সি # টিমের পক্ষে (উদাহরণস্বরূপ) লিনকিউ অন্বেষণ করা ভাল এবং ভবিষ্যতে হয়তো রেকর্ডের ধরণ এবং প্যাটার্ন মিলের চেয়ে কিছু সিনট্যাকটিক চিনি যুক্ত করা যা মানুষকে 4 টি কীস্ট্রোক বাঁচাতে পারে এবং সত্যই নয় যে কোনও অভিব্যক্তি যোগ করুন (আপনি সহায়ক হিসাবেও লিখতে static bool IsInRange<T>(this T candidate, T lower, T upper) where T : IComparable<T>পারেন এটি যদি সত্যই আপনাকে দেখতে বিরক্ত করে &&)
সারা

1
এসকিউএল বেশ "মূলধারার" এবং আপনি "1 থেকে 10 এর মধ্যে x" লিখতে পারেন
জোয়েলফ্যান 3'16

উত্তর:


30

এগুলি বাইনারি অপারেটর, যা শৃঙ্খলিত হলে সাধারণত এবং স্বাভাবিকভাবে একটি বিমূর্ত সিনট্যাক্স ট্রি তৈরি করে:

বাইনারি অপারেটরগুলির জন্য সাধারণ বিমূর্ত সিনট্যাক্স ট্রি

যখন মূল্যায়ন করা হয় (যা আপনি পাতাগুলি থেকে করেন), এটি থেকে বুলিয়ান ফলাফল তৈরি হয় x < y, তারপরে আপনি যা করার চেষ্টা করে একটি টাইপ ত্রুটি পাবেন boolean < z। আপনি x < y < zযেমন আলোচনা করেছেন তেমন কাজ করার জন্য আপনাকে একটি সংশ্লেষ গাছ তৈরি করার জন্য সংকলকটিতে একটি বিশেষ কেস তৈরি করতে হবে:

বিশেষ কেস সিনট্যাক্স ট্রি

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


1
"তারপরে আপনি বুলিয়ান <z" করার চেষ্টা করার ক্ষেত্রে একটি টাইপ ত্রুটি পেয়েছেন - যদি কম্পাইলার জেড তুলনা করার জন্য স্থানে y এর স্থানে মূল্যায়ন করে শৃঙ্খলার অনুমতি দেয় না not "এটি ভুল হয়ে যাওয়ার জন্য ভাষার প্রচুর জায়গা যোগ করে যে ভাষা ডিজাইনাররা যদি সম্ভব হয় তবে তা এড়ানো উচিত" " আসলে, পাইথনের এটি করতে কোনও সমস্যা নেই এবং পার্সিংয়ের যুক্তি একটি একক ফাংশনে সীমাবদ্ধ: hg.python.org/cpython/file/tip/Python/ast.c#l1122 - জিনিসগুলি যাওয়ার জন্য খুব বেশি জায়গা নয় not ভুল। "কখনও কখনও বাইনারি অপারেটরের মতো কাজ করে এবং কখনও কখনও কার্যকরভাবে ট্রাইনারি অপারেটরের মতো কাজ করে," পাইথনে পুরো তুলনা শৃঙ্খলাটি তিনটি।
অ্যারন হল

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

হ্যাঁ, কিন্তু ... সেখানে হয় ইতিমধ্যে একটি তিন অপারেটর ভাষার অনেক পাওয়া?
JensG

1
@ জেনসজি টেরিনারিটির স্বরলিপিটির অর্থ এটি 3 টি আর্গুমেন্ট গ্রহণ করে। আপনার লিঙ্কের প্রসঙ্গে, এটি একটি তিনটি শর্ত অপারেটর। স্পষ্টতই "ট্রিনিয়ার" একটি পরিভাষায় অপারেটরের জন্য গঠিত যা 2 লাগে তবে বাস্তবে 3 লাগে takes এই উত্তরটির সাথে আমার প্রাথমিক সমস্যাটি হ'ল এটি বেশিরভাগই FUD।
অ্যারন হল

2
আমি এই গৃহীত উত্তরের অন্যতম নিম্নমুখী। (@ জেএসটিজি: দয়া করে এই উত্তরটি গ্রহণ করুন না)) এই প্রশ্নটি কী x<y<zবা তার চেয়েও বড় কথা, এর অর্থ কী x<y<=z। এই উত্তরটি x<y<zট্রাইনারি অপারেটর হিসাবে ব্যাখ্যা করে । ঠিক এইভাবেই এই ভাল-সংজ্ঞায়িত গাণিতিক এক্সপ্রেশনটি ব্যাখ্যা করা উচিত নয়। x<y<zপরিবর্তে শর্টহ্যান্ড হয় (x<y)&&(y<z)। পৃথক তুলনা এখনও বাইনারি হয়।
ডেভিড হামেন

37

x < y < zপ্রোগ্রামিং ভাষাতে সাধারণত কেন পাওয়া যায় না?

এই উত্তরে আমি এটি শেষ করি

  • যদিও এই নির্মাণটি কোনও ভাষার ব্যাকরণে প্রয়োগ করতে তুচ্ছ এবং ভাষা ব্যবহারকারীদের জন্য মান তৈরি করে,
  • অন্যান্য বৈশিষ্ট্যগুলির তুলনায় এটির গুরুত্ব এবং ভাষার পরিচালন সংস্থাগুলির অনিচ্ছুক কারণে বেশিরভাগ ভাষায় এটির অস্তিত্ব নেই বলে প্রাথমিক কারণগুলি is
    • সম্ভাব্যভাবে ব্রেকিং ব্যবহারকারীদের দ্বারা বিরক্ত ব্যবহারকারীরা
    • বৈশিষ্ট্যটি (যেমন: অলসতা) বাস্তবায়নে সরানো।

ভূমিকা

আমি এই প্রশ্নে পাইথনিস্টের দৃষ্টিকোণ থেকে কথা বলতে পারি। আমি এই বৈশিষ্ট্যটি সহ কোনও ভাষার ব্যবহারকারী এবং আমি ভাষার প্রয়োগের বিবরণ অধ্যয়ন করতে চাই। এর বাইরেও, আমি সি এবং সি ++ (আইএসও স্ট্যান্ডার্ডটি কমিটি দ্বারা পরিচালিত হয় এবং বছরের দ্বারা সংস্করণিত হয় like) এর মতো ভাষা পরিবর্তনের প্রক্রিয়াটির সাথে কিছুটা পরিচিত।

পাইথনের ডকুমেন্টেশন এবং বাস্তবায়ন

ডক্স / ব্যাকরণ থেকে আমরা দেখতে পাচ্ছি যে আমরা তুলনামূলক অপারেটরগুলির সাথে যে কোনও সংখ্যা প্রকাশ করতে পারি:

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"

এবং ডকুমেন্টেশনে আরও বলা হয়েছে:

তুলনাগুলি নির্বিচারে বেঁধে রাখা যেতে পারে, উদাহরণস্বরূপ, x <y <= z এর সমতুল্য x <y এবং y <= z এর সমতুল্য, ব্যতীত কেবল y একবারই মূল্যায়ন করা হয় (তবে উভয় ক্ষেত্রেই x <y পাওয়া গেলে Z এর মোটেও মূল্যায়ন করা হয় না to be false)।

যৌক্তিক সাম্য

সুতরাং

result = (x < y <= z)

কথাটি হল সমতুল্য মূল্যায়ন পদ x, yএবং z, ব্যতিক্রম যে সঙ্গে yদুইবার মূল্যায়ন হয়:

x_lessthan_y = (x < y)
if x_lessthan_y:       # z is evaluated contingent on x < y being True
    y_lessthan_z = (y <= z)
    result = y_lessthan_z
else:
    result = x_lessthan_y

আবার, পার্থক্যটি হ'ল y এর সাথে কেবল একবার মূল্যায়ন করা হয় (x < y <= z)

(দ্রষ্টব্য, প্রথম বন্ধনীগুলি সম্পূর্ণ অপ্রয়োজনীয় এবং অপ্রয়োজনীয়, তবে আমি এগুলি অন্যান্য ভাষা থেকে আগতদের সুবিধার জন্য ব্যবহার করেছি এবং উপরের কোডটি বেশ আইনী পাইথন)

পার্স করা বিমূর্ত সিনট্যাক্স ট্রি পরিদর্শন করা হচ্ছে

পাইথন কীভাবে বেঁধে দেওয়া তুলনা অপারেটরগুলি পার্স করে তা আমরা পরিদর্শন করতে পারি:

>>> import ast
>>> node_obj = ast.parse('"foo" < "bar" <= "baz"')
>>> ast.dump(node_obj)
"Module(body=[Expr(value=Compare(left=Str(s='foo'), ops=[Lt(), LtE()],
 comparators=[Str(s='bar'), Str(s='baz')]))])"

সুতরাং আমরা দেখতে পাচ্ছি যে পাইথন বা অন্য কোনও ভাষার পার্স করার পক্ষে এটি সত্যিই কঠিন নয়।

>>> ast.dump(node_obj, annotate_fields=False)
"Module([Expr(Compare(Str('foo'), [Lt(), LtE()], [Str('bar'), Str('baz')]))])"
>>> ast.dump(ast.parse("'foo' < 'bar' <= 'baz' >= 'quux'"), annotate_fields=False)
"Module([Expr(Compare(Str('foo'), [Lt(), LtE(), GtE()], [Str('bar'), Str('baz'), Str('quux')]))])"

এবং বর্তমানে গৃহীত উত্তরের বিপরীতে, টেরিনারি অপারেশনটি একটি জেনেরিক তুলনা অপারেশন, এটি প্রথম এক্সপ্রেশন, নির্দিষ্ট তুলনাগুলির একটি পুনরাবৃত্ত এবং প্রয়োজনীয় হিসাবে মূল্যায়নের জন্য এক্সপ্রেশন নোডের একটি পুনরাবৃত্তি গ্রহণ করে। সহজ।

পাইথন উপসংহার

আমি ব্যক্তিগতভাবে পরিসীমা শব্দার্থতাকে বেশ মার্জিত বলে মনে করি এবং আমি জানি বেশিরভাগ পাইথন পেশাদাররা বৈশিষ্ট্যটির ব্যবহারকে ক্ষতিকারক হিসাবে বিবেচনা করার পরিবর্তে উত্সাহিত করবেন - শব্দার্থবিজ্ঞানগুলি সুপরিচিত ডকুমেন্টেশনে (স্পষ্টভাবে উপরে উল্লিখিত) বেশ স্পষ্টভাবে বলা হয়েছে।

নোট করুন যে কোডটি লেখা হওয়ার চেয়ে অনেক বেশি পঠিত। কোডের পঠনযোগ্যতার উন্নতি করে এমন পরিবর্তনগুলিকে আলিঙ্গন করা উচিত, ভয়, অনিশ্চয়তা এবং সন্দেহের জেনেরিক স্পেক্টার উত্থাপনের মাধ্যমে ছাড় দেওয়া উচিত নয় ।

তাহলে x x y <z প্রোগ্রামিং ভাষাতে সাধারণত কেন উপলব্ধ না?

আমি মনে করি যে বৈশিষ্ট্যের তুলনামূলক গুরুত্ব এবং ভাষার গভর্নরদের দ্বারা অনুমোদিত পরিবর্তনের আপেক্ষিক গতি / জড়তাকে কেন্দ্র করে এমন কয়েকটি কারণ রয়েছে।

অন্যান্য আরও গুরুত্বপূর্ণ ভাষা বৈশিষ্ট্য সম্পর্কে অনুরূপ প্রশ্ন জিজ্ঞাসা করা যেতে পারে

জাভা বা সি # তে কেন একাধিক উত্তরাধিকার পাওয়া যায় না? উভয় প্রশ্নের ভাল উত্তর এখানে নেই । বব মার্টিন অভিযোগ করেছেন, সম্ভবত বিকাশকারীরা খুব অলস ছিলেন এবং প্রদত্ত কারণগুলি কেবল অজুহাত। এবং একাধিক উত্তরাধিকার কম্পিউটার বিজ্ঞানের একটি খুব বড় বিষয়। অপারেটর শৃঙ্খলার চেয়ে এটি অবশ্যই গুরুত্বপূর্ণ।

সরল কাজের ক্ষেত্র বিদ্যমান

তুলনা অপারেটর শৃঙ্খলা মার্জিত, তবে একাধিক উত্তরাধিকার হিসাবে গুরুত্বপূর্ণ নয়। এবং জাভা এবং সি # এর কার্যকারিতা হিসাবে ইন্টারফেস যেমন রয়েছে, তেমনি প্রতিটি ভাষা একাধিক তুলনার জন্যও করে - আপনি কেবল তুলনামূলকভাবে বুলিয়ান "এবং" এর সাথে শৃঙ্খলাবদ্ধ করেন যা সহজেই যথেষ্ট কাজ করে।

বেশিরভাগ ভাষা কমিটি দ্বারা পরিচালিত হয়

বেশিরভাগ ভাষাগুলি কমিটির দ্বারা বিকশিত হচ্ছে (পাইথনের মতো জীবনের জন্য বুদ্ধিমান উপকারী ডিক্টেটর থাকার চেয়ে)। এবং আমি অনুমান করি যে এই সমস্যাটি এটির সম্পর্কিত কমিটিগুলি থেকে তৈরি করার পক্ষে যথেষ্ট সমর্থন দেখেনি।

যে ভাষাগুলি এই বৈশিষ্ট্যটি দেয় না সেগুলি কী পরিবর্তন করতে পারে?

যদি কোনও ভাষা x < y < zপ্রত্যাশিত গাণিতিক শব্দার্থ ছাড়াই অনুমতি দেয় তবে এটি একটি ব্রেকিং পরিবর্তন হবে। এটি যদি এটি প্রথম স্থানে অনুমতি না দেয় তবে এটি যুক্ত করা প্রায় তুচ্ছ হবে।

ব্রেকিং পরিবর্তন

ভাঙ্গা পরিবর্তনের সাথে ভাষাগুলি সম্পর্কে: আমরা ভাঙা আচরণের পরিবর্তনের সাথে ভাষাগুলি আপডেট করি - তবে ব্যবহারকারীরা এটি পছন্দ করেন না, বিশেষত ব্যবহারকারীদের এমন বৈশিষ্ট্যগুলি যা ভঙ্গ হতে পারে। যদি কোনও ব্যবহারকারী পূর্বের আচরণের উপর নির্ভর করে থাকে তবে x < y < zতারা সম্ভবত উচ্চস্বরে প্রতিবাদ করবে। এবং যেহেতু বেশিরভাগ ভাষা কমিটি দ্বারা পরিচালিত হয়, আমি সন্দেহ করি যে আমরা এই জাতীয় পরিবর্তনের পক্ষে সমর্থন করার জন্য অনেক রাজনৈতিক ইচ্ছা অর্জন করব।


সত্যি বলতে, আমি ভাষাগুলির দ্বারা সরবরাহ করা শব্দার্থবিজ্ঞানের সাথে কোনও সমস্যা নেই যা chain x <y <z chain এর মতো চেইন তুলনা ক্রিয়াকলাপ তবে এটি কোনও বিকাশকারীর পক্ষে মানসিকভাবে মানচিত্র x < y < zকরার জন্য তুচ্ছ (x < y) && (y < z)। নিট বাছাই, শৃঙ্খলাবদ্ধ তুলনার মানসিক মডেল হ'ল সাধারণ গণিত। ক্লাসিক তুলনাটি সাধারণভাবে গণিত নয়, তবে বুলিয়ান যুক্তিযুক্ত। x < yএকটি বাইনারি উত্তর উত্পাদন করে {0}y < zএকটি বাইনারি উত্তর উত্পাদন করে {1}{0} && {1}বর্ণনামূলক উত্তর উত্পাদন করে। যুক্তি রচনা করা হয়েছে, নির্লজ্জভাবে শৃঙ্খলিত নয়।
কে। অ্যালান বেটস

আরও ভাল যোগাযোগের জন্য, আমি উত্তরটি একটি বাক্য দিয়ে প্রফেস করেছি যা সরাসরি পুরো সামগ্রীর সংক্ষিপ্তসার করে। এটি একটি দীর্ঘ বাক্য, তাই আমি বুলেটের মধ্যে এটি ভেঙে ফেলেছি।
অ্যারন হল

2
কয়েকটি ভাষা এই বৈশিষ্ট্যটি প্রয়োগ করার মূল কারণ হ'ল গুইডোর আগে, কেউ এ সম্পর্কে চিন্তাও করেনি। সি থেকে উত্তরাধিকারী ভাষাগুলি এখন এই "সঠিক" (গণিতের অধিকার) পেতে পারে না মূলত কারণ সি এর বিকাশকারীরা 40 বছর আগে এটি "ভুল" (গাণিতিকভাবে ভুল) পেয়েছিলেন। সেখানে প্রচুর কোড রয়েছে যা এই ভাষাগুলি কীভাবে ব্যাখ্যা করে তার বিপরীত প্রকৃতির উপর নির্ভর করে x<y<z। কোনও ভাষার কাছে একবার এই অধিকারের মতো কিছু পাওয়ার সুযোগ থাকে এবং সেই সুযোগটি ভাষার শুরুতে।
ডেভিড হামেন

1
@ কে.এলানবেটস আপনি ২ টি পয়েন্ট করেন: 1) অপারেটর শৃঙ্খলাটি opালু এবং 2) সিনট্যাকটিক চিনির কোনও মূল্য নেই। প্রথমটিতে: আমি দেখিয়েছি যে অপারেটর শৃঙ্খলা 100% নিরঙ্কুশ, আমি কি তাই না? সম্ভবত কিছু প্রোগ্রামারগুলি নির্মাণ বোঝার ক্ষমতা বাড়ানোর জন্য মানসিকভাবে খুব অলস? দ্বিতীয় বক্তব্য: এটি আমার কাছে মনে হচ্ছে আপনি সরাসরি পঠনযোগ্যতার বিরুদ্ধে তর্ক করছেন? পাঠযোগ্যতার উন্নতি করার সময় সিনট্যাকটিক চিনি সাধারণত কোনও ভাল জিনিস হিসাবে বিবেচিত হয় না? যদি এভাবে চিন্তা করা স্বাভাবিক হয় তবে কোনও প্রোগ্রামার কেন এভাবে যোগাযোগ করতে চাইবে না? কোড পড়তে লিখতে হবে, না?
অ্যারন হল

2
I have watched both Ruby and Python implement breaking changes.যারা কৌতূহলী তাদের জন্য লুপ ভেরিয়েবল এবং ক্লোজারগুলির
এয়ারস্লিপার্পার্ট

13

কম্পিউটারের ভাষাগুলি সর্বনিম্ন সম্ভাব্য ইউনিটগুলি সংজ্ঞায়িত করার চেষ্টা করে এবং এগুলি সংহত করতে দেয়। ক্ষুদ্রতম ইউনিটটি "x <y" এর মতো কিছু হতে পারে যা বুলিয়ান ফলাফল দেয়।

আপনি কোনও টার্নারি অপারেটরের জন্য চাইতে পারেন। একটি উদাহরণ x <y <z হবে। এখন আমরা অপারেটরদের কি সংমিশ্রণের অনুমতি দিই? স্পষ্টতই x> y> z বা x> = y> = z বা x> y> = z বা x == y == z এর অনুমতি দেওয়া উচিত। X <y> z সম্পর্কে কী? x! = y! = z? শেষটির অর্থ কী, x! = Y এবং y! = Z বা তিনটিই আলাদা?

এখন যুক্তি প্রচার: সি বা সি ++ এ যুক্তিগুলি একটি সাধারণ ধরণের হিসাবে প্রচারিত হবে। তাহলে x এর অর্থ x <y <z এর অর্থ দ্বিগুণ তবে y এবং z দীর্ঘ দীর্ঘ? তিনজনেই কি ডাবল পদোন্নতি হয়েছে? অথবা y একবার হিসাবে দ্বিগুণ এবং দীর্ঘ সময় হিসাবে অন্য সময় নেওয়া হয়? সি ++ এ একজন বা উভয় অপারেটরই ওভারলোড হয়ে গেলে কী হবে?

এবং সর্বশেষে, আপনি কোনও সংখ্যক অপারেশনকে অনুমতি দিচ্ছেন? <B> c <d> e <f> g এর মতো?

ঠিক আছে, এটি সব খুব জটিল হয়ে যায়। এখন আমি যে বিষয়টিকে আপত্তি করি তা হ'ল x <y <z একটি সিনট্যাক্স ত্রুটি তৈরি করে। কারণ x <y <z আসলে কী করে তা অনুধাবন করতে পারে না এমন প্রারম্ভিকদের ক্ষতির তুলনায় এর কার্যকারিতা সামান্য।


4
সুতরাং, সংক্ষেপে, এটি ভাল নকশা করা একটি শক্ত বৈশিষ্ট্য।
জন পূর্দি

2
কোনও সুপরিচিত ভাষাতে এই বৈশিষ্ট্যটি কেন নেই তা বোঝানোর এটি কোনও কারণ নয়। প্রকৃতপক্ষে, এটি একটি ভাষাতে একটি ভাল সংজ্ঞায়িত উপায়ে অন্তর্ভুক্ত করা বেশ সহজ। এটি কেবল প্রতিটি অপারেটর বাইনারি হওয়ার পরিবর্তে একই ধরণের অপারেটরদের দ্বারা সংযুক্ত একটি তালিকা হিসাবে দেখার বিষয়। একই x + y + zপার্থক্যের জন্যও করা যেতে পারে , কেবলমাত্র পার্থক্যের সাথে এটি কোনও শব্দার্থগত পার্থক্য বোঝায় না। সুতরাং এটি ঠিক যে কোনও সুপরিচিত ভাষা কখনও এটিকে যত্ন করে না।
21

1
আমি মনে করি যে পাইথন এটা একটি অপ্টিমাইজেশান একটি বিট, (এর x < y < zসমতুল্য হচ্ছে ((x < y) and (y < z))কিন্তু yশুধুমাত্র মূল্যায়ন একবার ) যা আমি কল্পনা ভাষায় প্রায় তাদের পথ নিখুত চাই। "যেহেতু x <y <z আসলে কী করে তা অনুধাবন করতে পারে না এমন প্রারম্ভিকদের ক্ষতির তুলনায় এর উপযোগিতা কম।" আমি মনে করি এটি অবিশ্বাস্যভাবে দরকারী। সম্ভবত এটির জন্য -1
অ্যারন হল

যদি এর লক্ষ্য হল এমন একটি ভাষা ডিজাইন করা যা প্রোগ্রামারদের সবচেয়ে বোকামির জন্য বিভ্রান্তিকর হতে পারে এমন সমস্ত জিনিসকে সরিয়ে দেয় তবে এই জাতীয় ভাষা ইতিমধ্যে বিদ্যমান: কোবল। আমি বরং অজগর ব্যবহার করতাম, আমি যেখানে a < b > c < d > e < f > g" প্রকৃত " অর্থ সহ সত্যই কেউ লিখতে পারি (a < b) and (b > c) and (c < d) and (d > e) and (e < f) and (f > g)। আপনি যে লিখতে পারেন তার অর্থ এই নয় যে আপনার উচিত। এ জাতীয় দানব দূরীকরণ কোড কোড পর্যালোচনার পরিধেয়। অন্যদিকে, 0 < x < 8পাইথনে লেখার সুস্পষ্ট (কোনও ভয়ের উদ্ধৃতি নেই) অর্থ x একচেটিয়াভাবে 0 থেকে 8 এর মধ্যে থাকে।
ডেভিড হামেন

@ ডেভিডহ্যামেন, বিদ্রূপজনকভাবে, সিওবিওএল সত্যিই একটি <বি <সি
জোয়েলফ্যানকে

10

অনেক প্রোগ্রামিং ভাষায়, x < yএকটি বাইনারি এক্সপ্রেশন যা দুটি অপারেশন গ্রহণ করে এবং একক বুলিয়ান ফলাফলের জন্য মূল্যায়ন করে। অতএব, যদি একাধিক অভিব্যক্তি শৃঙ্খলাবদ্ধ হয়ে থাকে true < zএবং false < zতা কোনও অর্থবোধ করে না, এবং যদি সেই অভিব্যক্তিগুলি সফলভাবে মূল্যায়ন করে, তবে তারা সম্ভবত ভুল ফলাফল তৈরি করতে পারে।

এটি x < yএকটি ফাংশন কল হিসাবে ভাবা অনেক সহজ যা দুটি পরামিতি নেয় এবং একক বুলিয়ান ফলাফল দেয়। আসলে, এটি কতগুলি ভাষা হুডের নীচে এটি প্রয়োগ করে it এটি কম্পোজেবল, সহজেই সংকলনযোগ্য এবং এটি ঠিক কাজ করে।

x < y < zদৃশ্যকল্প আরো অনেক কিছু জটিল। এখন কম্পাইলার, কার্যকরী, ফ্যাশন হয়েছে তিন ফাংশন: x < y, y < z, এবং যারা দুইটি মানের ফলে একসঙ্গে ANDed সব একটি তর্কসাপেক্ষে প্রসঙ্গের মধ্যে দ্ব্যর্থক ভাষা ব্যাকরণ

কেন তারা অন্য উপায়ে এটি করেছে? কারণ এটি দ্ব্যর্থহীন ব্যাকরণ, প্রয়োগ করা অনেক সহজ এবং সঠিক হওয়া সহজ।


2
আপনি যদি ভাষাটি ডিজাইন করেন তবে আপনার এটি সঠিক ফলাফল করার সুযোগ রয়েছে ।
জেসিটিজি

2
অবশ্যই এটি প্রশ্নের উত্তর দেয়। প্রশ্ন সত্যিই হয়, তাহলে কেন "কোন ভাষায় ডিজাইনার বেছে নেওয়া হয়েছে কারণ যে।", উত্তর আপনি যদি এর থেকে আরও ভাল উত্তর নিয়ে আসতে পারেন তবে এটির জন্য যান। নোট করুন যে জনাশার তার উত্তরের প্রথম অনুচ্ছেদে মূলত একই জিনিসটি বলেছেন ।
রবার্ট হার্ভে

3
আবার, আপনি চুল বিভক্ত করছেন। প্রোগ্রামাররা এটি করতে ঝোঁক। "আপনি আবর্জনা নিতে চান?" "সংখ্যা" "আপনি আবর্জনা ফেলবেন?" "হ্যাঁ।"
রবার্ট হার্ভে

2
আমি শেষ অনুচ্ছেদেও প্রতিদ্বন্দ্বিতা করি। পাইথন চেইনের তুলনা সমর্থন করে এবং এর পার্সারটি এলএল (1)। এটা না অগত্যা পারেন এবং সংজ্ঞায়িত শব্দার্থবিদ্যা বাস্তবায়ন কঠিন: পাইথন শুধু বলছেন যে e1 op1 e2 op2 e3 op3 ...সমতূল্য e1 op e2 and e2 op2 e3 and ...ছাড়া প্রতিটি অভিব্যক্তি শুধুমাত্র একবার মূল্যায়ন করা হয়। (বিটিডব্লিউ এই সাধারণ নিয়মের বিভ্রান্তিকর পার্শ্ব প্রতিক্রিয়া রয়েছে যে স্টেটমেন্টগুলির মতো বিবৃতি a == b is Trueআর

2
@ রবার্টহারভেই re:answerমূল প্রশ্নটিতে আমার মন্তব্যের জন্য এই মুহুর্তে আমার মন তত্ক্ষণাত্ চলে গেল। x < y < zভাষা শব্দার্থবিজ্ঞানের কোনও নির্দিষ্ট মান যুক্ত করার জন্য আমি সমর্থনটিকে বিবেচনা করি না । (x < y) && (y < z)আরও বিস্তৃতভাবে সমর্থিত, আরও স্পষ্টত, আরও অভিব্যক্তিকর, আরও সহজেই এর উপাদানগুলির মধ্যে হজম হয়, আরও সংশ্লেষযোগ্য, আরও যুক্তিযুক্ত, আরও সহজে পুনরায় সঞ্চারিত।
কে। অ্যালান বেটস

6

বেশিরভাগ মূলধারার ভাষা হ'ল (অন্তত আংশিক) অবজেক্ট-ওরিয়েন্টেড। মূলত, ওওর অন্তর্নিহিত মূলনীতিটি হ'ল বস্তুগুলি অন্য অবজেক্টগুলিতে (বা তাদের নিজেরাই) বার্তা প্রেরণ করে এবং সেই বার্তাটির রিসিভারের কীভাবে সেই বার্তার প্রতিক্রিয়া জানাতে হবে তার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে।

এখন, আসুন আমরা কীভাবে এরকম কিছু বাস্তবায়ন করব তা দেখুন

a < b < c

আমরা একে কঠোরভাবে বাম-থেকে-ডান (বাম-সহযোগী) মূল্যায়ন করতে পারি:

a.__lt__(b).__lt__(c)

কিন্তু এখন আমরা কল __lt__এর ফলাফলে a.__lt__(b), যা একটি হল Boolean। ওটা কোন অর্থ প্রকাশ করে না.

আসুন ডান-সহযোগী চেষ্টা করুন:

a.__lt__(b.__lt__(c))

নাহ, তাও বোঝা যায় না। এখন, আমাদের আছে a < (something that's a Boolean)

ঠিক আছে, সিনট্যাকটিক চিনি হিসাবে এটি চিকিত্সা সম্পর্কে কি। আসুন এন <তুলনা একটি শৃঙ্খলা তৈরি করুন একটি এন-1-অ্যারি বার্তা প্রেরণ করুন। এর অর্থ হতে পারে, আমরা বার্তা পাঠাতে __lt__করতে a, ক্ষণস্থায়ী bএবং cআর্গুমেন্ট হিসাবে:

a.__lt__(b, c)

ঠিক আছে, এটি কাজ করে তবে এখানে একটি অদ্ভুত অসম্পূর্ণতা রয়েছে: aএটি এর চেয়ে কম কিনা তা সিদ্ধান্ত নিতে পারে b। কিন্তু bসিদ্ধান্ত নিতে তা চেয়ে কম হয় পাবেন না c, এর পরিবর্তে যে সিদ্ধান্ত হয় এছাড়াও দ্বারা তৈরি a

এন-আরি বার্তা প্রেরণ হিসাবে এটি ব্যাখ্যা সম্পর্কে কী this?

this.__lt__(a, b, c)

অবশেষে! এটি কাজ করতে পারে। তবে এর অর্থ হ'ল বস্তুর ক্রম হ'ল আর বস্তুর সম্পত্তি নয় (যেমন a, তার চেয়ে কম বা bতার সম্পত্তি aনয় b) বরং পরিবর্তে প্রসঙ্গের সম্পত্তি (অর্থাত this)।

একটি মূলধারার দিক থেকে যা অদ্ভুত বলে মনে হয় seems তবে, যেমন হাস্কেল-এ, এটি সাধারণ। সেখানে একাধিক বিভিন্ন বাস্তবায়নের হতে পারে Ordtypeclass, উদাহরণস্বরূপ, এবং কিনা বা না aহয় কম b, উপর যা typeclass উদাহরণস্বরূপ সুযোগ হতে হবে নির্ভর করে।

কিন্তু আসলে, তাই নয় কি যে সব সময়ে অদ্ভুত! জাভা ( Comparator) এবং। নেট ( IComparer) উভয়ের ইন্টারফেস রয়েছে যা আপনাকে নিজের অর্ডারিং সম্পর্ক যেমন উদ্বৃত্তকরণ অ্যালগরিদমগুলিতে ইনজেক্ট করতে দেয়। সুতরাং, তারা পুরোপুরি স্বীকার করে যে কোনও অর্ডারিং এমন কোনও জিনিস নয় যা কোনও প্রকারের সাথে স্থির থাকে তবে পরিবর্তে প্রসঙ্গে নির্ভর করে।

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

a = b

হয় না বার্তা পাঠানোর হিসেবে ব্যাখ্যা =করতে aপার bবার্তা পাঠানোর যুক্তি হিসেবে, বরং যেমন ="বর্তমান গ্রাউন্ড" (একটি ধারণা অনুরূপ কিন্তু অভিন্ন না this) পাশ করার aএবং bআর্গুমেন্ট হিসাবে। সুতরাং, a = bহিসাবে ব্যাখ্যা করা হয়

=(a, b)

এবং না

a =(b)

এটি সহজেই এন-আরি অপারেটরগুলিতে সাধারণীকরণ করা যেতে পারে।

মনে রাখবেন যে এটি ওও ভাষাগুলির কাছে সত্যই অদ্ভুত। ওওতে, আমাদের সর্বদা একটি একক অবজেক্ট থাকে যা কোনও বার্তা প্রেরণের ব্যাখ্যার জন্য চূড়ান্তভাবে দায়ী এবং আমরা যেমন দেখেছি a < b < cযে কোন অবজেক্টের মতো হওয়া উচিত তা তাত্ক্ষণিকভাবে স্পষ্ট নয় ।

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

বিশেষ করে, <করে না মানে "কম", বরং এই ফাংশন সামান্য ভিন্নভাবে ব্যাখ্যা করা হয়:

(<  a b c d) ; the sequence a, b, c, d is monotonically increasing
(>  a b c d) ; the sequence a, b, c, d is monotonically decreasing
(<= a b c d) ; the sequence a, b, c, d is monotonically non-decreasing
(>= a b c d) ; the sequence a, b, c, d is monotonically non-increasing

3

এটি কেবল কারণ ভাষা ডিজাইনাররা এটি ভাবেননি বা ভাবেননি এটি একটি ভাল ধারণা। আপনি সাধারণ (প্রায়) এলএল (1) ব্যাকরণ দিয়ে বর্ণনা হিসাবে পাইথন এটি করে।


1
এটি এখনও কোনও মূলধারার ভাষায় সাধারণ ব্যাকরণের সাথে বিশ্লেষণ করবে; @ রবার্টহার্ভি যে কারণে দিয়েছে তা কেবল এটি সঠিকভাবে বোঝা যাবে না।
ম্যাসন হুইলারের 21

পুনঃটুইট করেছেন যদি নিয়মগুলি এমনভাবে লিখিত হয় যাতে অন্য অপারেটরগুলির সাথে তুলনাগুলি বিনিময়যোগ্য হয় (বলুন, কারণ তাদের একই নজির রয়েছে) তবে আপনি সঠিক আচরণ পাবেন না। পাইথন সমস্ত তুলনা এক স্তরের উপর রাখে তা আসলে ক্রমটিকে সংমিশ্রণ হিসাবে বিবেচনা করে।
নিল জি

1
আসলে তা না. 1 < 2 < 3জাভা বা সি # তে রাখুন এবং অপারেটরের অগ্রাধিকার নিয়ে আপনার কোনও সমস্যা নেই; আপনার অবৈধ প্রকারের সমস্যা আছে। সমস্যাটি হ'ল এটি যেমন লিখেছে ঠিক তেমনিভাবে বিশ্লেষণ করবে তবে পৃথক তুলনার ক্রম থেকে এটি একটি শৃঙ্খলাবদ্ধ তুলনায় পরিণত করার জন্য আপনাকে সংকলকটিতে বিশেষ-ক্ষেত্রে যুক্তির প্রয়োজন।
ম্যাসন হুইলার 21

2
@ ম্যাসনভিয়েল আমি যা বলছি তা হ'ল ভাষাটি এটির কাজ করার জন্য তৈরি করতে হবে। এর একটি অংশ সঠিকভাবে ব্যাকরণ পাচ্ছে। (যদি নিয়মগুলি এমনভাবে লিখিত হয় যাতে অন্যান্য অপারেটরগুলির সাথে তুলনাগুলি বিনিময়যোগ্য হয়, বলুন কারণ তাদের একই নজির রয়েছে, তবে আপনি সঠিক আচরণ পাবেন না)) এর আরও একটি অংশটি এসটিকে সংমিশ্রণ হিসাবে ব্যাখ্যা করছে, যা সি ++ না আমার উত্তরের মূল বিষয়টি হ'ল এটি একটি ভাষা ডিজাইনারের সিদ্ধান্ত।
নিল জি

@ ম্যাসনওহেলার আমি মনে করি আমরা একমত হই। আমি কেবল হাইলাইট করছিলাম যে এর পক্ষে ব্যাকরণটি সঠিকভাবে পাওয়া শক্ত নয়। আপনি কেবল এটি এইভাবে কাজ করতে চান তা আগাম সিদ্ধান্ত নেওয়ার বিষয়।
নিল জি

2

নিম্নোক্ত সি ++ প্রোগ্রামটি বেঁধে থাকা নারীর একটি উঁকি দিয়ে সংকলন করে, এমনকি সর্বোচ্চ সম্ভাব্য স্তরে ( -Weverything) সতর্কতা সেট করেও :

#include <iostream>
int main () { std::cout << (1 < 3 < 2) << '\n'; }

অন্যদিকে gnu সংকলক স্যুট আমাকে সুন্দরভাবে সতর্ক করে দিয়েছে comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses]

সুতরাং, আমার প্রশ্নটি হ'ল এক্স <ওয়াই <z> কেন সাধারণত প্রোগ্রামিং ভাষায় প্রত্যাশিত শব্দার্থক শব্দগুলির সাথে পাওয়া যায় না?

উত্তরটি সহজ: পিছনের সামঞ্জস্য। বন্য অঞ্চলে প্রচুর পরিমাণে কোড রয়েছে যা সমান ব্যবহার করে 1<3<2এবং ফলাফলটি সত্য-ইশ হওয়ার প্রত্যাশা করে।

কোনও ভাষা ডিজাইনারের কাছে এই "সঠিক" পাওয়ার একটি সুযোগ রয়েছে এবং ভাষাটি প্রথম ডিজাইনের সময় এটিই। প্রাথমিকভাবে এটি "ভুল" পান মানে অন্যান্য প্রোগ্রামাররা দ্রুত "ভুল" আচরণের পরিবর্তে সুবিধা গ্রহণ করবে। দ্বিতীয়বার এটি "ডান" পেতে এটি বিদ্যমান কোড বেসটি ভেঙে দেবে।


+1 কারণ এই প্রোগ্রামটি '1 'কে এমন এক অভিব্যক্তির ফলাফল হিসাবে আউটপুট করে যা গণিতে স্পষ্টতই মিথ্যা। যদিও এটি অনুমোদিত হয়েছে, অদম্য পরিবর্তনশীল নামগুলির সাথে একটি বাস্তব-বিশ্বের উদাহরণ যদি এই ভাষার বৈশিষ্ট্যটি যুক্ত করা হয় তবে ডিবাগিং দুঃস্বপ্নে পরিণত হবে।
শেঠ ব্যাটিন

@ শেঠব্যাটিন - এটি পাইথনের কোনও ডিবাগিং দুঃস্বপ্ন নয়। পাইথনের একমাত্র সমস্যা হ'ল if x == y is True : ...আমার অভিমত: এই ধরণের কোড লেখার লোকেরা কিছু অতিরিক্ত-বিশেষ, অসাধারণ ধরণের নির্যাতনের শিকার হওয়ার প্রাপ্য যে (যদি তিনি এখন বেঁচে থাকতেন) তোড়কোমদা নিজেই অজ্ঞান করে দিতেন।
ডেভিড হামেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.