অ্যাসাইনমেন্ট অপারেটর একটি মূল্য ফেরত দেওয়ার সুবিধা কী?


27

আমি এমন একটি ভাষা বিকাশ করছি যা আমি জাভাস্ক্রিপ্ট এবং পিএইচপি উভয়ই প্রতিস্থাপন করতে চাই। (আমি এটি নিয়ে কোনও সমস্যা দেখতে পাচ্ছি না It's এটির মতো নয় যে কোনও একটি ভাষার বড় ইনস্টল বেস রয়েছে))

আমি যে জিনিসটি পরিবর্তন করতে চেয়েছিলাম তার মধ্যে একটি হ'ল এসাইনমেন্ট অপারেটরকে একটি এসাইনমেন্ট কমান্ডে পরিণত করা, প্রত্যাবর্তিত মানটি ব্যবহারের ক্ষমতা সরিয়ে দেওয়া।

x=1;          /* Assignment. */
if (x==1) {}  /* Comparison. */
x==1;         /* Error or warning, I've not decided yet. */
if (x=1) {}   /* Error. */

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

অথবা এটা? অ্যাসাইনমেন্ট অপারেটরের রিটার্ন মানটির ব্যবহারিক ব্যবহার রয়েছে যা তুচ্ছভাবে পুনরায় লেখা যায় না? (যে কোনও ভাষার ক্ষেত্রে এমন ধারণা রয়েছে))


12
জেএস এবং পিএইচপি-র কোনও বড় "ইনস্টল বেস" নেই?
mhr

47
@ মিঃ আমি কটূক্তি সন্দেহ করি।
অ্যান্ডি হান্ট

12
আমি মনে করতে পারি শুধুমাত্র দরকারী কেস while((x = getValue()) != null) {}। প্রতিস্থাপনগুলি অসাধারণ হবে যেহেতু আপনাকে অ্যাসাইনমেন্টটি ব্যবহার breakবা পুনরায় করা দরকার x = getValue
কোডসইনচাউস

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

4
আমি আপনাকে পরামর্শ দিচ্ছি যে যদি আপনার উদ্দেশ্যটি একটি বিদ্যমান ভাষার উন্নতি করতে হয় এবং আপনি এটিকে ব্যাপকভাবে গ্রহণের পরিকল্পনা করেন তবে বিদ্যমান ভাষার সাথে 100% পিছনে সামঞ্জস্যতা ভাল। একটি উদাহরণ হিসাবে টাইপস্ক্রিপ্ট দেখুন। যদি আপনার উদ্দেশ্যটি কোনও বিদ্যমান ভাষার আরও ভাল বিকল্প সরবরাহ করা হয় তবে আপনার অনেক বেশি সমস্যা হয়। একটি নতুন ভাষা বিদ্যমান ভাষার তুলনায় অনেক বেশি ভাল একটি বিদ্যমান বাস্তব সমস্যা সমাধান করতে হবে যাতে স্যুইচিংয়ের জন্য ব্যয় করতে হয়। একটি ভাষা শেখা একটি বিনিয়োগ এবং এটি পরিশোধ করা প্রয়োজন।
এরিক লিপার্ট

উত্তর:


25

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

এটি করে এমন বিদ্যমান ভাষাগুলির দিকে নজর দেওয়া সার্থক হতে পারে।

  • জাভা এবং সি # অ্যাসাইনমেন্টটিকে একটি অভিব্যক্তি রাখে তবে বুলেঁদের মূল্যায়ন করার শর্তের প্রয়োজনের দ্বারা আপনি উল্লিখিত সমস্যাটি সরিয়ে ফেলুন। এটি বেশিরভাগ ক্ষেত্রেই ভালভাবে কাজ করছে বলে মনে হয়, যদিও লোকেরা মাঝে মধ্যে অভিযোগ করে যে এটি এর ধরণের if (x)জায়গায় if (x != null)বা তার if (x != 0)উপর নির্ভর করে শর্তগুলি অস্বীকার করে x
  • পাইথন অ্যাসাইনমেন্টের পরিবর্তে অ্যাসাইনমেন্টকে যথাযথ বিবৃতি দেয়। এটিকে পরিবর্তনের প্রস্তাব মাঝেমধ্যে পাইথন-আইডিয়াগুলি মেলিং তালিকায় পৌঁছে যায় তবে আমার বিষয়গত ধারণাটি হ'ল এটি খুব কমই ঘটে এবং ডু-উইল লুপগুলি, স্যুইচ স্টেটমেন্টগুলি, মাল্টি-লাইন ল্যাম্বডাসের মতো অন্যান্য "অনুপস্থিত" বৈশিষ্ট্যগুলির তুলনায় প্রতিবার কম শব্দ উত্পন্ন করে, প্রভৃতি

যাইহোক, পাইথন এক বিশেষ ক্ষেত্রে অনুমতি দেয়, একই সময়ে একাধিক নামের বরাদ্দ: a = b = c। এটি একটি বিবৃতি হিসাবে সমান হিসাবে বিবেচিত হয় b = c; a = b, এবং এটি মাঝে মাঝে ব্যবহৃত হয়, সুতরাং এটি আপনার ভাষায় যুক্ত করার মতোও হতে পারে (তবে আমি এটি ঘামতে চাই না, কারণ এই সংযোজনটি পিছনের দিকে সামঞ্জস্যপূর্ণ হওয়া উচিত)।


5
a = b = cঅন্যান্য উত্তরগুলি সত্যিকার অর্থে আসে না এমন আনার জন্য +1 ।
লিও

6
তৃতীয় রেজোলিউশন হ'ল অ্যাসাইনমেন্টের জন্য আলাদা প্রতীক ব্যবহার করা। :=অ্যাসাইনমেন্টের জন্য পাস্কেল ব্যবহার ।
ব্রায়ান

5
@ ব্রায়ান: প্রকৃতপক্ষে, সি # হিসাবেও। =অ্যাসাইনমেন্ট, ==তুলনা হয়।
মার্জন ভেনেমা

3
সি # তে, এর মতো কিছু if (a = true)একটি C4706 সতর্কতা ফেলে দেবে ( The test value in a conditional expression was the result of an assignment.)। সি সহ জিসিসি একইভাবে একটি নিক্ষেপ করবে warning: suggest parentheses around assignment used as truth value [-Wparentheses]। এই সতর্কতাগুলিকে অতিরিক্ত বন্ধনীগুলির সেট দিয়ে নিঃশব্দ করা যেতে পারে, তবে তারা স্পষ্টভাবে এই নিয়োগটি ইচ্ছাকৃতভাবে নির্দেশ করার জন্য উত্সাহ দেওয়ার জন্য রয়েছে।
বব

2
@ ডেলানান কেবল কিছুটা সাধারণ মন্তব্য, তবে "বুলিয়ানদের মূল্যায়নের জন্য শর্তগুলির প্রয়োজনীয়তার দ্বারা আপনি যে ধরণের সমস্যাটি উল্লেখ করেছেন তা সরিয়ে ফেলুন" - দিয়ে a = true এটি বুলিয়ানকে মূল্যায়ন করে এবং তাই কোনও ত্রুটি নয়, তবে এটি সি # তে সম্পর্কিত সতর্কতাও উত্থাপন করে।
বব

11

অ্যাসাইনমেন্ট অপারেটরের রিটার্ন মানটির ব্যবহারিক ব্যবহার রয়েছে যা তুচ্ছভাবে পুনরায় লেখা যায় না?

সাধারণত বলছি, না। একটি অ্যাসাইনমেন্ট এক্সপ্রেশনটির মান থাকার ধারণার যে মূল্য নির্ধারিত হয়েছিল তা হ'ল আমাদের কাছে এমন একটি ভাব রয়েছে যা এর পার্শ্ব প্রতিক্রিয়া এবং এর মান উভয়ের জন্যই ব্যবহার করা যেতে পারে এবং এটি অনেকে বিভ্রান্তিকর বলে মনে করেন।

সাধারণ ব্যবহারগুলি সাধারণত প্রকাশকে কমপ্যাক্ট করতে হয়:

x = y = z;

"ধরণের রূপান্তরিত y কে y এর ধরণে রূপান্তরিত মান নির্ধারণ করুন, রূপান্তরিত মান হ'ল এক্সপ্রেশনের মান, এক্সকে টাইপ করুন, এক্সকে নির্ধারিত করুন" এর সি # তে শব্দার্থক চিহ্ন রয়েছে।

তবে আমরা ইতিমধ্যে একটি বিবৃতি প্রসঙ্গে ইম্পেরটিটিভ পার্শ্ব প্রতিক্রিয়াগুলির রাজ্যে রয়েছি, সুতরাং এর ওপরে সত্যিই খুব কম বাধ্যকারী বেনিফিট রয়েছে

y = z;
x = y;

একইভাবে

M(x = 123);

একটি সংক্ষিপ্ত হচ্ছে

x = 123;
M(x);

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

আমি এমন একটি ভাষা বিকাশ করছি যা আমি জাভাস্ক্রিপ্ট এবং পিএইচপি উভয়ই প্রতিস্থাপন করতে চাই।

আপনি যদি সত্যিই সাহসী হতে চান এবং জোর দিয়ে বলতে চান যে অ্যাসাইনমেন্টটি একটি বিবৃতি এবং কোনও সাম্য নয়, তবে আমার পরামর্শটি হ'ল: এটিকে স্পষ্ট করে একটি কার্যনির্বাহী বিবৃতি দিন

let x be 1;

লাল টা. অথবা

x <-- 1;

বা আরও ভাল:

1 --> x;

বা আরও ভাল এখনও

1 → x;

এগুলির কোনওরও বিভ্রান্ত হতে চলেছে এমন কোনও উপায় নেই x == 1


1
ওয়ার্ল্ড কি প্রোগ্রামিং ভাষায় নন-এএসসিআইআই ইউনিকোড প্রতীকগুলির জন্য প্রস্তুত?
বিলপিজ

আপনার পরামর্শ অনুসারে আমি যতটা পছন্দ করব, আমার লক্ষ্যগুলির মধ্যে একটি হ'ল বেশিরভাগ "ভাল লেখা" জাভাস্ক্রিপ্ট খুব কম বা কোনও পরিবর্তন ছাড়াই পোর্ট করা যেতে পারে।
বিলপিজ

2
@ বিলপগ: বিশ্ব কি প্রস্তুত ? আমি জানি না - ইউনিকোড আবিষ্কারের কয়েক দশক আগে, 1964 সালে বিশ্ব কি এপিএলের জন্য প্রস্তুত ছিল? এখানে এপিএলে একটি প্রোগ্রাম রয়েছে যা প্রথম 40 এর মধ্যে ছয় সংখ্যার এলোমেলো ক্রম ছাড়ায়: x[⍋x←6?40] এপিএলের নিজস্ব বিশেষ কীবোর্ডের প্রয়োজন ছিল, তবে এটি ছিল বেশ সফল ভাষা।
এরিক লিপার্ট

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

এইচএম, কেন কেউ "ডানদিকে" পছন্দ করতে পছন্দ করবে a+b*c --> x? এটি আমার কাছে অদ্ভুত লাগছে।
Ruslan

9

বহু ভাষা পাইথন সহ একটি অভিব্যক্তি না করে অ্যাসাইনমেন্টের বিবরণীটি বেছে নেয়:

foo = 42 # works
if foo = 42: print "hi" # dies
bar(foo = 42) # keyword arg

এবং গোলং:

var foo int
foo = 42 # works
if foo = 42 { fmt.Printn("hi") } # dies

অন্যান্য ভাষায় অ্যাসাইনমেন্ট নেই, বরং স্কোপড বাইন্ডিং রয়েছে, যেমন ওক্যামেল:

let foo = 42 in
  if foo = 42 then
    print_string "hi"

তবে letএটি একটি অভিব্যক্তি নিজেই।

অ্যাসাইনমেন্টের অনুমতি দেওয়ার সুবিধাটি হ'ল আমরা শর্তসাপেক্ষে কোনও ফাংশনের রিটার্ন মানটি সরাসরি পরীক্ষা করতে পারি, যেমন এই পার্ল স্নিপেটে:

if (my $result = some_computation()) {
  say "We succeeded, and the result is $result";
}
else {
  warn "Failed with $result";
}

পার্ল অতিরিক্তভাবে কেবলমাত্র শর্তসাপেক্ষে ঘোষণাটি স্কোপ করে, যা এটি খুব দরকারী করে তোলে। আপনি সেখানে কোনও নতুন ভেরিয়েবল ঘোষণা না করে শর্তযুক্তের ভিতরে নির্ধারণ করে দিলে - if ($foo = $bar)এটি সতর্ক করবে, সতর্ক if (my $foo = $bar)করবে , করবে না।

অন্য বিবৃতিতে অ্যাসাইনমেন্ট করা সাধারণত পর্যাপ্ত, তবে স্কোপিংয়ের সমস্যা আনতে পারে:

my $result = some_computation()
if ($result) {
  say "We succeeded, and the result is $result";
}
else {
  warn "Failed with $result";
}
# $result is still visible here - eek!

গোলং ত্রুটি যাচাইয়ের জন্য রিটার্ন মানগুলিতে খুব বেশি নির্ভর করে। সুতরাং এটি শর্তসাপেক্ষে একটি সূচনা বিবৃতি গ্রহণের অনুমতি দেয়:

if result, err := some_computation(); err != nil {
  fmt.Printf("Failed with %d", result)
}
fmt.Printf("We succeeded, and the result is %d\n", result)

অন্যান্য ভাষাগুলি শর্তাধীন ভিতরে নন-বুলেটিয়ান এক্সপ্রেশনগুলি অস্বীকার করতে একটি টাইপ সিস্টেম ব্যবহার করে:

int foo;
if (foo = bar()) // Java does not like this

অবশ্যই এটি ব্যর্থ হয় যখন কোনও ফাংশন ব্যবহার করে যা বুলিয়ান দেয়।

আমরা এখন দুর্ঘটনাজনিত কার্যভারের বিরুদ্ধে রক্ষার জন্য বিভিন্ন প্রক্রিয়া দেখেছি:

  • অভিব্যক্তি হিসাবে অ্যাসাইনমেন্টটি বাতিল করুন
  • স্ট্যাটিক টাইপ চেকিং ব্যবহার করুন
  • নিয়োগের অস্তিত্ব নেই, আমাদের কেবল letবাইন্ডিং রয়েছে
  • কোনও সূচনা বিবরণীর অনুমতি দিন, অন্যথায় অ্যাসাইনমেন্টটি বাতিল করুন
  • ঘোষণা ছাড়াই শর্তসাপেক্ষে অ্যাসাইনমেন্টটি বাতিল করুন

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

সংক্ষিপ্ত কোডের চেয়ে বাগ-মুক্ত কোডটি গুরুত্বপূর্ণ।


"অভিব্যক্তি হিসাবে অ্যাসাইনমেন্টটি বাতিল করুন" এর জন্য +1। কার্য-হিসাবে-এক্স-এক্সপ্রেশন হিসাবে অ্যাসাইনমেন্টের ব্যবহারের ক্ষেত্রে বাগ এবং পঠনযোগ্যতার সমস্যাগুলির সম্ভাব্যতা ন্যায্য নয়।
অকর্মা

7

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

সমস্যাটি ফিক্স করবেন না কেন?

অ্যাসাইনমেন্টের জন্য = এর পরিবর্তে এবং == সমতা পরীক্ষার জন্য, কেন ব্যবহার করবেন না: = অ্যাসাইনমেন্টের জন্য এবং = (বা এমনকি ==) সমতার জন্য?

পালন:

if (a=foo(bar)) {}  // obviously equality
if (a := foo(bar)) { do something with a } // obviously assignment

আপনি যদি প্রোগ্রামারটির পক্ষে সমতার জন্য অ্যাসাইনমেন্টটি ভুল করে তুলতে চান তবে আরও শক্ত করে তুলুন।

একই সময়ে, আপনি যদি সত্যিই সমস্যাটি সমাধান করতে চেয়েছিলেন, আপনি সি ক্রকটি মুছে ফেলবেন যে দাবী করেছে যে বুলিয়ানরা কেবল পূর্বনির্ধারিত প্রতীকী চিনির নামযুক্ত পূর্ণসংখ্যা ছিল। তাদের সম্পূর্ণ আলাদাভাবে তৈরি করুন। তারপরে, বলার পরিবর্তে

int a = some_value();
if (a) {}

আপনি প্রোগ্রামারকে লিখতে বাধ্য করেছেন:

int a = some_value();
if (a /= 0) {} // Note that /= means 'not equal'.  This is your Ada lesson for today.

সত্যটি হ'ল অ্যাসাইনমেন্ট-অ-অপারেটর একটি খুব দরকারী নির্মাণ। আমরা রেজার ব্লেডগুলি মুছে ফেলিনি কারণ কিছু লোকেরা তাদের কেটে ফেলে। পরিবর্তে, কিং জিলেট সুরক্ষা রেজার আবিষ্কার করেছিলেন।


2
(1) :=অ্যাসাইনমেন্টের জন্য এবং =সাম্যতার জন্য এই সমস্যাটি সংশোধন করতে পারে, তবে প্রতিটি প্রোগ্রামার যিনি অ মূল-মূলধারার ভাষার একটি ছোট সেট ব্যবহার করে বড় হননি তাদের বিভ্রান্তির মূল্যে। (২) বুলস এবং পূর্ণসংখ্যার মিশ্রণের কারণে বুলগুলি ব্যতীত অন্য ধরণের ক্ষেত্রে সর্বদা অনুমতি দেয় না, এটি অন্য ধরণের সত্য / মিথ্যা ব্যাখ্যা দেওয়ার পক্ষে যথেষ্ট। সি থেকে বিচ্যুত হতে ভীত নয় এমন আরও নতুন ভাষা পূর্ণসংখ্যা ব্যতীত অন্য ধরণের ক্ষেত্রে এটি করেছে (যেমন পাইথন খালি সংগ্রহকে মিথ্যা বলে মনে করে)।

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

1
@ ডেলানন: একজন জ্ঞানী ব্যক্তি একবার বলেছিলেন "এটিকে যতটা সম্ভব সহজ করুন, তবে কোনও সহজ নয়।" যদি আপনার উদ্দেশ্য যদি বিপুল পরিমাণ a = b বনাম a == বি ত্রুটিগুলি অপসারণ করে, শর্তসাপেক্ষ পরীক্ষার ডোমেনটিকে বুলিয়ানগুলিতে সীমাবদ্ধ করে দেয় এবং <অন্য> -> বুলিয়ান এর জন্য ডিফল্ট ধরণের রূপান্তর নিয়মগুলি সরিয়ে দেয় boo আছে। সেই সময়ে, যদি (a = b) {synt কেবল সিন্টেক্সিকভাবে আইনী হয় যদি a এবং b উভয় বুলিয়ান হয় এবং একটি আইনী মূল্য থাকে।
জন আর স্ট্রোহম

তর্কসাপেক্ষে - নিয়োগ মেকিং এক বিবৃতিতে হিসাবে সহজ হিসাবে অন্তত হয় এমনকি সহজ চেয়ে - পরিবর্তনগুলি আপনি উত্থাপন করা, এবং জাতিসংঘের অন্তত যতটা - তর্কসাপেক্ষে আরও বেশি (এমনকি অনুমতি দেয় না if (a = b)lvalue একটি, বুলিয়ান A, B জন্য)। অবিচলিত টাইপিংয়ের ভাষায়, এটি আরও ভাল ত্রুটি বার্তা দেয় (পার্স টাইম বনাম রান সময়)। তদ্ব্যতীত, "a = b বনাম a == বি ত্রুটিগুলি" প্রতিরোধ করা কেবলমাত্র প্রাসঙ্গিক উদ্দেশ্য হতে পারে না। উদাহরণস্বরূপ, আমি কোডটি if items:বলতে চাইলে অনুমতিও if len(items) != 0দিতে চাই এবং বুলিয়ানগুলিতে শর্ত সীমাবদ্ধ রেখে আমাকে ছেড়ে দিতে হবে।

1
@ ডেলান পাসকাল একটি মূল-মূলধারার ভাষা? কয়েক মিলিয়ন মানুষ পাস্কাল (এবং / অথবা মডুলা, যা পাস্কাল থেকে প্রাপ্ত) ব্যবহার করে প্রোগ্রামিং শিখেছে। এবং ডেল্ফি এখনও অনেক দেশে সাধারণত ব্যবহৃত হয় (সম্ভবত আপনার এতটা না)।
জেগে উঠছে

5

প্রকৃতপক্ষে প্রশ্নের উত্তরের জন্য, হ্যাঁ এর কয়েকটি ব্যবহার যদিও এগুলি সামান্য কুলুঙ্গি।

জাভাতে উদাহরণস্বরূপ:

while ((Object ob = x.next()) != null) {
    // This will loop through calling next() until it returns null
    // The value of the returned object is available as ob within the loop
}

obএমবেডড অ্যাসাইনমেন্টটি ব্যবহার না করে বিকল্পের জন্য লুপের স্কোপের বাইরে সংজ্ঞায়িত এবং x.next () নামক দুটি পৃথক কোড অবস্থানের প্রয়োজন হয়।

এটি ইতিমধ্যে উল্লেখ করা হয়েছে যে আপনি এক ধাপে একাধিক ভেরিয়েবল বরাদ্দ করতে পারেন।

x = y = z = 3;

এই ধরণের জিনিসটি সর্বাধিক সাধারণ ব্যবহার, তবে সৃজনশীল প্রোগ্রামাররা সবসময় আরও কিছু নিয়ে আসে।


লুপের শর্তটি কি হ্রাস পাবে এবং obপ্রতিটি লুপের সাথে একটি নতুন অবজেক্ট তৈরি করবে ?
ব্যবহারকারী 393232000

@ ব্যবহারকারী 393232000 সেক্ষেত্রে সম্ভবত না, সাধারণত x.next () কোনও কিছুর উপরে পুনরাবৃত্তি করে। এটি সম্ভবত এটি সম্ভব যদিও।
টিম বি

1

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

অন্য কথায়, এটি আইনী করুন:

a=b=c=0;

তবে এটিকে অবৈধ করুন:

if (a=b) ...

2
এটি একটি অ্যাড-হক নিয়মের মতো বলে মনে হচ্ছে। অ্যাসাইনমেন্টটি একটি বিবৃতি তৈরি করা এবং অনুমতি দেওয়ার জন্য এটি প্রসারিত করা a = b = cআরও অরথগোনাল মনে হয় এবং এটি কার্যকর করাও সহজ। এই দুটি পদ্ধতির এক্সপ্রেশন ( a + (b = c)) এ্যাসাইনমেন্ট সম্পর্কে একমত নয়, তবে আপনি সেগুলির পক্ষে অবস্থান নেন নি তাই আমি ধরে নিই যে তারা কিছু যায় আসে না।

"কার্যকর করা সহজ" খুব বেশি বিবেচনা করা উচিত নয়। আপনি একটি ইউজার ইন্টারফেস সংজ্ঞায়িত করছেন - ব্যবহারকারীদের প্রয়োজনকে প্রথমে রাখুন। আপনার নিজের থেকে নিজেকে জিজ্ঞাসা করতে হবে এই ব্যবহারটি ব্যবহারকারীকে সহায়তা করে বা বাধা দেয় কিনা।
ব্রায়ান ওকলে

আপনি যদি আলিতে অন্তর্নিহিত রূপান্তরকে অস্বীকার করেন তবে আপনাকে শর্তে নিয়োগের বিষয়ে চিন্তা করতে হবে না
র‌্যাচেট ফ্রিক

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

@ratchetfreak আপনার কাছে এখনও বাস্তব বুলস
জে কে

0

এর শব্দ শুনে আপনি মোটামুটি কঠোর ভাষা তৈরির পথে রয়েছেন।

এই বিষয়টি মাথায় রেখে, লোকেরা লিখতে বাধ্য করছে:

a=c;
b=c;

পরিবর্তে:

a=b=c;

লোকদের করা থেকে বিরত রাখতে উন্নতি বলে মনে হতে পারে:

if (a=b) {

যখন তারা বোঝাতে চেয়েছিল:

if (a==b) {

তবে শেষ অবধি, এই ধরণের ত্রুটিগুলি আইনী কোড কিনা তা সম্পর্কে সনাক্ত করা এবং সতর্ক করা সহজ।

তবে এমন পরিস্থিতি রয়েছে যেখানে করছেন:

a=c;
b=c;

এর অর্থ এই নয়

if (a==b) {

সত্য হবে।

যদি সি আসলে একটি ফাংশন সি () হয় তবে প্রতিবার যখন এটি বলা হয় তখন এটি বিভিন্ন ফলাফল দিতে পারে। (এটি কম্পিউটারেও ব্যয়বহুল হতে পারে ...)

অনুরূপভাবে যদি সি মেমরিযুক্ত ম্যাপড হার্ডওয়্যারগুলির পয়েন্টার হয় তবে then

a=*c;
b=*c;

উভয়ই আলাদা হওয়ার সম্ভাবনা রয়েছে এবং প্রতিটি পঠনের হার্ডওয়্যারটিতে বৈদ্যুতিন প্রভাবও থাকতে পারে।

হার্ডওয়্যার সহ প্রচুর অন্যান্য অনুমতি রয়েছে যেখানে নির্দিষ্ট সময়সীমা থেকে মেমরি ঠিকানাগুলি কী থেকে পড়া হয়, লিখিত হয় এবং নির্দিষ্ট সময় সীমাবদ্ধতার অধীনে আপনাকে সুনির্দিষ্ট হওয়া দরকার, যেখানে একই লাইনে একাধিক অ্যাসাইনমেন্ট করা সময়সীমার ঝুঁকি ছাড়াই দ্রুত, সহজ এবং সুস্পষ্ট that অস্থায়ী ভেরিয়েবল প্রবর্তন


4
সমান a = b = cনা a = c; b = c, এটি b = c; a = b। এটি পার্শ্ব প্রতিক্রিয়াগুলির সদৃশতা এড়ায় aএবং bএকই ক্রমে সংশোধন করে। এছাড়াও, হার্ডওয়্যার সংক্রান্ত এই সমস্ত যুক্তিগুলি একধরনের বোকামি: বেশিরভাগ ভাষা সিস্টেম ভাষা নয় এবং এগুলি সমস্যাগুলি সমাধান করার জন্য তৈরি করা হয় না বা এই সমস্যাগুলি ঘটে এমন পরিস্থিতিতে ব্যবহার করা হয় না। এটি জাভাস্ক্রিপ্ট এবং / অথবা পিএইচপি স্থানান্তর করার চেষ্টা করে এমন ভাষার জন্য দ্বিগুণ।

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

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

@ ডেলানন: মূল্যকে bএক টেম্পে টাইপের ধরণে রূপান্তর করা হয় এবং এটি aঅন্য টেম্পের ধরণে রূপান্তরিত হয় । সেই মানগুলি কখন সংরক্ষণ করা হয় তার আপেক্ষিক সময় নির্ধারিত। ভাষা-নকশার দৃষ্টিকোণ থেকে, আমি একাধিক-অ্যাসাইনমেন্ট স্টেটমেন্টের সমস্ত লিভেলের সমান প্রকারের মিল থাকা এবং সম্ভবত এটিরও প্রয়োজন যে এগুলির কোনওটিই অস্থিতিশীল না হওয়া যুক্তিসঙ্গত মনে করি।
সুপারক্যাট

0

অ্যাসাইনমেন্ট থাকার বিষয়টি সম্পর্কে আমার মনে সবচেয়ে বড় সুবিধাটি হ'ল এটি আপনার ব্যাকরণটিকে আরও সহজ হতে দেয় যদি আপনার লক্ষ্যগুলির মধ্যে একটি যদি "সবকিছুই একটি প্রকাশ" - বিশেষত এলআইএসপির লক্ষ্য of

পাইথনে এটি নেই; এর এক্সপ্রেশন এবং স্টেটমেন্ট রয়েছে, অ্যাসাইনমেন্টটি একটি স্টেটমেন্ট। পাইথন একটি lambdaফর্মকে একক প্যারামিটারাইজড এক্সপ্রেশন হিসাবে সংজ্ঞায়িত করে , এর অর্থ আপনি ল্যাম্বডায় ভেরিয়েবল বরাদ্দ করতে পারবেন না। এটি সময়ে অসুবিধাজনক, তবে একটি জটিল সমস্যা নয়, এবং পাইথনের একটি বিবৃতি হতে অ্যাসাইনমেন্ট পাওয়া আমার অভিজ্ঞতার একমাত্র নিম্নচাপ about

অ্যাসাইনমেন্টের অনুমতি দেওয়ার একটি উপায়, বা অ্যাসাইনমেন্টের প্রভাব, if(x=1)সি এর সাথে ঘটে যাওয়া দুর্ঘটনার সম্ভাবনার পরিচয় না দিয়েই একটি অভিব্যক্তি হওয়ার জন্য একটি এলআইএসপি-এর মতো letকনস্ট্রাক্ট ব্যবহার করা যেমন (let ((x 2) (y 3)) (+ x y))আপনার ভাষাতে যেমন মূল্যায়ন করা যেতে পারে 5letআপনি যদি letএকটি লেজিকাল স্কোপ তৈরির জন্য সংজ্ঞায়িত করেন তবে এইভাবে ব্যবহার করে আপনার ভাষায় প্রযুক্তিগতভাবে অ্যাসাইনমেন্ট দেওয়ার দরকার নেই । সেভাবে সংজ্ঞায়িত করে, কোনও letকনস্ট্রাক্ট একইভাবে সংকলন করা যেতে পারে যেমন আর্গুমেন্টের সাথে নেস্ট ক্লোজার ফাংশনটি নির্মাণ এবং কল করার জন্য।

অন্যদিকে, আপনি যদি কেবল if(x=1)মামলার সাথে সংশ্লিষ্ট হন তবে সি হিসাবে যেমন অ্যাসাইনমেন্টটি প্রকাশ করতে চান তবে সম্ভবত বিভিন্ন টোকেন নির্বাচন করা যথেষ্ট। নিয়োগ: x := 1বা x <- 1। তুলনা: x == 1। সিনট্যাক্স ত্রুটি: x = 1


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

@ ডেলানন: আমি এমন একটি সংমিশ্রণটি দেখতে চাই যা পুনরায় নিয়োগ নিষিদ্ধ করবে তবে পুনরায় ঘোষণার অনুমতি দেবে, এমন নিয়মের সাপেক্ষে যে (১) পুনঃসংশোধন কেবলমাত্র ঘোষণা-ও-নিয়োগ শনাক্তকারীদের জন্য আইনী হবে এবং (২) ) পুনঃনির্ধারণ সমস্ত সংলগ্ন স্কোপে একটি পরিবর্তনশীল "অঘোষিত" করবে। সুতরাং, কোনও বৈধ শনাক্তকারীর মান that নামের পূর্ববর্তী ঘোষণায় যা কিছু নির্ধারিত ছিল তা হবে। এটি কেবল কয়েকটি লাইনের জন্য ব্যবহৃত ভেরিয়েবলগুলির জন্য স্কোপিং ব্লক যুক্ত করা বা প্রতিটি টেম্প ভেরিয়েবলের জন্য নতুন নাম প্রণয়ন করার চেয়ে কিছুটা সুন্দর মনে হবে।
সুপারক্যাট

0

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

প্রকৃতপক্ষে. এটি নতুন কিছু নয়, সি ভাষার সমস্ত নিরাপদ উপগ্রহ ইতিমধ্যে এই সিদ্ধান্তে পৌঁছেছে।

মিস্রা-সি, সিইআরটি-সি এবং সমস্ত অবস্থার ভিতরে নিষেধাজ্ঞার কার্যভার, কেবলমাত্র বিপজ্জনক বলে।

শর্তগুলির অভ্যন্তরে অ্যাসাইনমেন্টের উপর নির্ভর করে কোডটি আবার লেখা যায় না এমন কোনও ক্ষেত্রেই বিদ্যমান নেই।


তদ্ব্যতীত, এই জাতীয় মানগুলি রাইটিং কোডের বিরুদ্ধেও সতর্ক করে যা মূল্যায়নের আদেশের উপর নির্ভর করে। একক সারিতে একাধিক অ্যাসাইনমেন্ট x=y=z;এমন একটি মামলা case যদি একাধিক অ্যাসাইনমেন্টযুক্ত সারিটিতে পার্শ্ব প্রতিক্রিয়া (কলিং ফাংশন, অস্থায়ী ভেরিয়েবলগুলি অ্যাক্সেস করা) থাকে তবে আপনি প্রথমে কোন পার্শ্ব প্রতিক্রিয়াটি ঘটাবেন তা আপনি জানতে পারবেন না।

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

সমাধানটির সাথে কোডটি প্রতিস্থাপন করা হত y=z; x=y;। এটি একটি সিকোয়েন্স পয়েন্ট যুক্ত করে এবং মূল্যায়নের ক্রমের গ্যারান্টি দেয়।


সুতরাং সি এর ফলে সৃষ্ট সমস্ত সমস্যার উপর ভিত্তি করে, যে কোনও আধুনিক ভাষা শর্তের অভ্যন্তরে নিষেধাজ্ঞার পাশাপাশি একক সারিতে একাধিক অ্যাসাইনমেন্ট উভয়কেই ভাল করতে পারে।

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