সিনট্যাক্স ডিজাইন - কোন যুক্তি পাস না হয়ে কেন বন্ধনী ব্যবহার করবেন?


66

অনেক ভাষায় সিনট্যাক্স function_name(arg1, arg2, ...)একটি ফাংশন কল করতে ব্যবহৃত হয়। যখন আমরা কোনও যুক্তি ছাড়াই ফাংশনটি কল করতে চাই, আমাদের অবশ্যই করতে হবে function_name()

আমার কাছে এটি অদ্ভুত মনে হয়েছে যে কোনও সংকলক বা স্ক্রিপ্ট দোভাষীকে ()এটি সফলভাবে একটি ফাংশন কল হিসাবে সনাক্ত করতে হবে। যদি কোনও ভেরিয়েবল কলযোগ্য হিসাবে পরিচিত হয় তবে কেন function_name;পর্যাপ্ত হবে না?

অন্যদিকে, কিছু ভাষায় আমরা করতে পারি: function_name 'test';বা এমনকি function_name 'first' 'second';কোনও ফাংশন বা কমান্ড কল করতে।

আমি মনে করি যদি প্রথম বন্ধনের অগ্রাধিকার ক্রম ঘোষণার প্রয়োজন হয় তবে অন্যান্য স্থানে wereচ্ছিক ছিল he উদাহরণস্বরূপ, করছেন if expression == true function_name;হিসাবে হিসাবে বৈধ হওয়া উচিত if (expression == true) function_name();

আমার মতে সবচেয়ে বিরক্তিকর কাজটি হ'ল 'SOME_STRING'.toLowerCase()যখন প্রোটোটাইপ ফাংশন দ্বারা স্পষ্টত কোনও যুক্তির প্রয়োজন হয় না। ডিজাইনাররা কেন সহজটির বিরুদ্ধে সিদ্ধান্ত নিয়েছিল 'SOME_STRING'.lower?

দাবি অস্বীকার: আমাকে ভুল করবেন না, আমি সি-এর মতো সিনট্যাক্স পছন্দ করি! ;) আমি কেবল জিজ্ঞাসা করছি এটি আরও ভাল হতে পারে কিনা। প্রয়োজনীয়তার ()কোনও কার্যকারিতা সুবিধা রয়েছে বা কোড বোঝা আরও সহজ করে তোলে? কারণটি আসলে কী তা সম্পর্কে আমি সত্যিই আগ্রহী।


103
আপনি যদি অন্য কোনও ফাংশনের যুক্তি হিসাবে কোনও ফাংশনটি পাস করতে চান তবে আপনি কী করবেন?
ভিনসেন্ট সাভার্ড

30
যতক্ষণ কোড মানুষের দ্বারা পড়ার প্রয়োজন হয় ততক্ষণ পঠনযোগ্যতা রাজা।
তুলাইনস কর্ডোভা

75
আপনি পঠনযোগ্যতার সাথে এটি সম্পর্কে জিজ্ঞাসা করেছেন (), তবুও আপনার পোস্টে যে বিষয়টি দাঁড়িয়ে আছে তা হল if (expression == true)বিবৃতি। আপনি অতিমাত্রার জন্য উদ্বিগ্ন (), তবুও একটি অতিরিক্ত অতিরিক্ত ব্যবহার করুন == true:)
ডেভিড আরনো

15
ভিজ্যুয়াল বেসিক
এটির

14
এটি পাস্কেলে বাধ্যতামূলক ছিল, আপনি কেবল কার্যাদি এবং কার্যবিধির জন্য প্যারেনগুলি ব্যবহার করেছিলেন যা আর্গুমেন্ট নিয়েছিল।
রিমকো গ্রিলিচ

উত্তর:


251

যে ভাষাগুলি প্রথম-শ্রেণীর ফাংশন ব্যবহার করে তাদের পক্ষে এটি খুব সাধারণ যে কোনও ফাংশনকে উল্লেখ করার সিনট্যাক্সটি হ'ল:

a = object.functionName

যখন আইন কলিং যে ফাংশন:

b = object.functionName()

aউপরের উদাহরণে উপরের ফাংশনের রেফারেন্স হবে (এবং আপনি এটি দ্বারা এটি কল করতে পারেন a()), যখন bফাংশনের রিটার্ন মান থাকবে।

কিছু ভাষাগুলি প্রথম বন্ধনী ছাড়াই ফাংশন কল করতে পারে, তবে তারা ফাংশনটি কল করছে কিনা , বা কেবল ফাংশনটি উল্লেখ করছে কিনা তা বিভ্রান্ত হতে পারে।


9
আপনি উল্লেখ করতে পারেন যে এই পার্থক্যটি কেবলমাত্র পার্শ্ব প্রতিক্রিয়াগুলির উপস্থিতিতে আকর্ষণীয় - একটি বিশুদ্ধ ফাংশনটির জন্য এটি
বিবেচ্য

73
@ বার্গি: খাঁটি ফাংশনগুলির জন্য এটি অনেক গুরুত্বপূর্ণ! আমার যদি এমন কোনও ফাংশন থাকে make_listযা তার যুক্তিগুলিকে একটি তালিকায় প্যাক করে, f(make_list)একটি ফাংশনটি fপাস করা বা খালি তালিকায় পাস করার মধ্যে একটি বড় পার্থক্য রয়েছে ।
ব্যবহারকারী 2357112

12
@ বার্গি: তবুও, আমি এখনও SATInstance.solveতাৎক্ষণিকভাবে চালানোর চেষ্টা না করেই অন্য কোনও ফাংশনটিতে বা অন্য কোনও অবিশ্বাস্য ব্যয়বহুল খাঁটি ফাংশনটি পাস করতে সক্ষম হতে চাই । খাঁটি হিসাবে ঘোষিত হয়েছে someFunctionকিনা someFunctionতার উপর নির্ভর করে কিছু আলাদা করে যদি এটি জিনিসগুলিকে সত্যই বিশ্রী করে তোলে । উদাহরণস্বরূপ, যদি আমি (pseudocode হয়) আছে func f() {return g}, func g() {doSomethingImpure}এবং func apply(x) {x()}তারপর, apply(f)কল f। যদি আমি তারপর ঘোষণা করছি যে fবিশুদ্ধ হয়, তাহলে হঠাৎ apply(f)পাসের gজন্য apply, এবং applyকল gএবং কিছু অশুদ্ধ করে।
ব্যবহারকারী 2357112

6
@ ব্যবহারকারী 2357112 মূল্যায়ন কৌশল বিশুদ্ধতা থেকে স্বতন্ত্র। কী সম্ভব তা মূল্যায়ন করার জন্য কলগুলির বাক্য বাক্য গঠন ব্যবহার করে (তবে সম্ভবত বিশ্রী), তবে ফলাফল বা এর সঠিকতা পরিবর্তন করে না। আপনার উদাহরণ সম্পর্কে apply(f), যদি gনাপাক (এবং applyপাশাপাশি?) তবে পুরো জিনিসটি নাপাক এবং অবশ্যই ভেঙে যায়।
বার্গি

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

63

প্রকৃতপক্ষে, স্কালা এটি অনুমোদিত করে, যদিও এর পরে একটি কনভেনশন হয়: যদি পদ্ধতিটির পার্শ্ব-প্রতিক্রিয়া থাকে তবে যাইহোক, বন্ধনী ব্যবহার করা উচিত।

সংকলক লেখক হিসাবে, আমি প্রথম বন্ধুত্বের গ্যারান্টিযুক্ত উপস্থিতিটি বেশ সুবিধাজনক খুঁজে পাব; আমি সর্বদা জানতে পারি যে এটি একটি পদ্ধতি কল, এবং বিজোড় মামলার জন্য আমাকে দ্বিখণ্ডিত করতে হবে না।

প্রোগ্রামার এবং কোড রিডার হিসাবে, বন্ধনীগুলির উপস্থিতি কোনও প্যারামিটারগুলি পাস না করেও কোনও সন্দেহ নেই যে এটি একটি পদ্ধতি কল।

প্যারামিটারগুলি পাস করা কোনও পদ্ধতি কলের একমাত্র সংজ্ঞায়িত বৈশিষ্ট্য নয়। আমি কেন প্যারামিটার-কম পদ্ধতির সাথে পরামিতি রয়েছে এমন কোনও পদ্ধতির চেয়ে আলাদা করব?


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

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

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

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

3
এমনকি প্রয়োজনীয় "অনুষ্ঠানের" অনুপস্থিতির জন্য যেমন আমি রুবির প্রশংসা করতে এসেছি - প্যারেন্স, ধনুর্বন্ধনী, সুস্পষ্ট প্রকার - আমি বলতে পারি যে পদ্ধতি-প্রথম বন্ধনীটি দ্রুত পড়ে ; তবে একবার পরিচিত আইডিয়োম্যাটিক রুবি বেশ পাঠযোগ্য এবং স্পষ্টভাবে লেখার জন্য দ্রুত।
রডারবব

19

এটি আসলে সিনট্যাক্স পছন্দগুলির একটি দুর্দান্ত সূক্ষ্ম ফ্লুক। আমি কার্যকরী ভাষায় কথা বলব, যা টাইপড ল্যাম্বদা ক্যালকুলাসের উপর ভিত্তি করে।

বলা ভাষাগুলিতে, প্রতিটি ফাংশনের ঠিক একটি যুক্তি থাকে । আমরা প্রায়শই "একাধিক যুক্তি" হিসাবে যা ভাবি তা আসলে পণ্যের ধরণের একক প্যারামিটার। সুতরাং উদাহরণস্বরূপ, ফাংশন যা দুটি পূর্ণসংখ্যার সাথে তুলনা করে:

leq : int * int -> bool
leq (a, b) = a <= b

পূর্ণসংখ্যার একক জোড়া লাগে। প্রথম বন্ধনীগুলি ফাংশন পরামিতিগুলি বোঝায় না ; তারা তর্কটির সাথে প্যাটার্ন-মিল করতে ব্যবহৃত হয় । আপনাকে সত্যই নিশ্চিত করতে যে এটি সত্যই একটি যুক্তি, আমরা জোড়টিকে ডিকনস্ট্রাক্ট করার জন্য প্যাটার্ন মিলের পরিবর্তে প্রজেক্টিভ ফাংশনগুলি ব্যবহার করতে পারি:

leq some_pair = some_pair.1 <= some_pair.2

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

এমন কোনও ফাংশন সম্পর্কে কী বলা যায় যা সম্পর্কে কোনও যুক্তি নেই? যেমন একটি ফাংশন আসলে ডোমেন আছে Unit। এর একক সদস্য Unitসাধারণত হিসাবে লিখিত হয় (), যে কারণে প্রথম বন্ধনী উপস্থিত হয়।

say_hi : Unit -> string
say_hi a = "Hi buddy!"

এই ফাংশনটি কল করতে, আমাদের এটিকে টাইপের একটি মানতে প্রয়োগ করতে হবে Unit, যা হওয়া আবশ্যক (), তাই আমরা লেখার শেষ করি say_hi ()

সুতরাং, আর্গুমেন্টের তালিকা হিসাবে আসলে কিছুই নেই!


3
এবং এই কারণেই খালি বন্ধনীগুলি ()চামচকে হ্যান্ডেল বিয়োগের সাথে সাদৃশ্যপূর্ণ।
মাইন্ডউইন

3
পরিবর্তে leqব্যবহার করে এমন একটি ফাংশন সংজ্ঞায়িত করা বেশ বিভ্রান্তিকর! <<=
কেআরয়ান

5
এই উত্তরটি যদি "পণ্যের ধরণ" এর মতো বাক্যাংশের পাশাপাশি "টিপল" শব্দটি ব্যবহার করে তবে এটি বুঝতে সহজ হতে পারে।
কেভিন

বেশিরভাগ আনুষ্ঠানিকতা ইনফ চ (ইনট এক্স, ইনট y) কে I ^ 2 থেকে I পর্যন্ত একটি ফাংশন হিসাবে বিবেচনা করবে L লাম্বডা ক্যালকুলাস আলাদা, অন্যান্য ফর্মালিজমের সাথে উচ্চ ধার্মিকতার সাথে মেলে এই পদ্ধতিটি ব্যবহার করে না। পরিবর্তে ল্যাম্বদা ক্যালকুলাস কারিঙ ব্যবহার করে। তুলনা হবে x -> (y -> (x <= y))। (x -> (y -> (x <= y)) 2 মূল্যায়ন করবে (y-> 2 <= y) এবং (x -> (y -> (x <= y)) 2 3 এ মূল্যায়ন করবে ( y-> 2 <= y) 3 যা পরিবর্তে 2 <= 3 এ মূল্যায়ন করে
তাইমির

1
@ পেরিটাব্রেটা আমি ()ইউনিটের প্রতিনিধিত্ব করার জন্য ব্যবহারের ইতিহাসের সাথে পরিচিত নই । আমি যদি অন্তত কারণটির কিছু অংশ "প্যারামিটারলেস ফাংশন" এর অনুরূপ হত তবে অবাক হব না। তবে সিনট্যাক্সের আরও সম্ভাব্য ব্যাখ্যা রয়েছে। বীজগণিতের ধরণগুলিতে Unitআসলে পণ্য ধরণের জন্য পরিচয়। একটি বাইনারি পণ্য হিসাবে লিখিত হয় (a,b), আমরা হিসাবে একটি unary পণ্য লিখতে পারে (a), তাই একটি যৌক্তিক বর্ধন হ'ল সহজভাবে nullary পণ্য লিখতে হবে ()
বাগেরহেড

14

জাভাস্ক্রিপ্টে উদাহরণস্বরূপ কোনও পদ্ধতির নাম ব্যবহার করে () ছাড়া এটি কার্যকর না করে ফাংশনটি নিজেই ফেরত দেয়। আপনি উদাহরণস্বরূপ অন্য পদ্ধতিতে যুক্তি হিসাবে ফাংশনটি পাস করতে পারেন।

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


4
+1 যতক্ষণ না মানুষের দ্বারা পড়ার কোড দরকার, ততক্ষণ পাঠযোগ্যতা রাজা।
তুলাইনস কর্ডোভা

1
@ তুলিনস কর্ডোভা আমি নিশ্চিত পার্ল আপনার সাথে একমত।
রাছিতে

@ রাচিট: পার্ল কিন্তু নাও করতে Perl Best Practicesপারে
slebetman

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

জাভাতে এটি কোনও পদ্ধতি "সনাক্ত" করে না। এটি এটি কল। Object::toStringএকটি পদ্ধতি চিহ্নিত করে।
njzk2

10

সিনট্যাক্স শব্দার্থবিজ্ঞান অনুসরণ করে, সুতরাং আসুন শব্দার্থবিদ্যা থেকে শুরু করা:

কোন ফাংশন বা পদ্ধতি ব্যবহারের উপায়গুলি কী কী?

আসলে, একাধিক উপায় রয়েছে:

  • যুক্তিযুক্ত বা যুক্তি ছাড়াই একটি ফাংশন বলা যেতে পারে
  • একটি ফাংশন একটি মান হিসাবে গণ্য করা যেতে পারে
  • একটি ফাংশন আংশিকভাবে প্রয়োগ করা যেতে পারে (কমপক্ষে একটি কম আর্গুমেন্ট নিয়ে একটি ক্লোজার তৈরি করা এবং পাস হওয়া যুক্তিগুলি বন্ধ করে)

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

সি এবং সি-জাতীয় ভাষায়:

  • একটি ফাংশন কল করার জন্য আর্গুমেন্টগুলি (যেমন কোনওটিই নাও থাকতে পারে) বদ্ধ করার জন্য বন্ধনী ব্যবহার করে করা হয় func()
  • একটি ফাংশনকে মান হিসাবে চিকিত্সা করা কেবল নাম হিসাবে এটি ব্যবহার করে করা যেতে পারে &func(সি একটি ফাংশন পয়েন্টার তৈরি করে)
  • কিছু ভাষায়, আপনার আংশিক প্রয়োগের জন্য সংক্ষিপ্ত হাতের সিনট্যাক্স রয়েছে; জাভা someVariable::someMethodউদাহরণস্বরূপ অনুমতি দেয় (পদ্ধতি রিসিভারের মধ্যে সীমাবদ্ধ তবে এখনও দরকারী)

প্রতিটি ব্যবহার কীভাবে আলাদা সিনট্যাক্সের বৈশিষ্ট্যযুক্ত তা আপনাকে সহজেই আলাদা করে বলতে দেয়।


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

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

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

@ পেরিটাব্রেটা: ভাল পয়েন্ট, স্থির।
ম্যাথিউ এম।

8

পার্শ্ব প্রতিক্রিয়াযুক্ত একটি ভাষায় এটি আইএমও একটি পরিবর্তনশীল পড়ার (তাত্ত্বিক পার্শ্ব প্রতিক্রিয়া মুক্ত) মধ্যে পার্থক্য করতে সত্যই সহায়ক

variable

এবং একটি ফাংশন কল, যা পার্শ্ব প্রতিক্রিয়া হতে পারে

launch_nukes()

OTOH, যদি কোনও পার্শ্ব প্রতিক্রিয়া না হয় (টাইপ সিস্টেমে এনকোড করা ব্যতীত) তবে ভেরিয়েবলটি পড়া এবং কোনও আর্গুমেন্ট না দিয়ে কোনও ফাংশন কল করার মধ্যে পার্থক্য করার কোনও মানে নেই।


1
নোট করুন যে ওপিটি এমন এক ক্ষেত্রে উপস্থিত হয়েছিল যেখানে কোনও অবজেক্টই একমাত্র আর্গুমেন্ট এবং ফাংশন নামের আগে উপস্থাপিত হয় (যা ফাংশন নামের জন্য একটি সুযোগও প্রদান করে)। noun.verbসিনট্যাক্স অর্থ হিসাবে পরিষ্কার noun.verb()এবং কিছুটা কম বিশৃঙ্খল হতে পারে । একইভাবে, একটি member_বাম রেফারেন্স ফিরিয়ে দেওয়া একটি ফাংশন একটি সাধারণ সেটার ফাংশনের চেয়ে বন্ধুত্বপূর্ণ সিনট্যাক্স সরবরাহ করতে পারে: obj.member_ = new_valueবনাম obj.set_member(new_value)( _পোস্টফিক্সটি "লুকানো" ফাংশনগুলির _ উপসর্গগুলির স্মরণ করিয়ে দেয় "উন্মুক্ত" বলে একটি ইঙ্গিত )।
পল এ। ক্লেটন

1
@ পলএ ড। ক্লেটন আমি দেখতে পাচ্ছি না এটি কীভাবে আমার উত্তরের আওতাভুক্ত নয়: যদি noun.verbফাংশন আমন্ত্রণের অর্থ হয় তবে আপনি কীভাবে এটি কেবল সদস্য অ্যাক্সেস থেকে আলাদা করবেন?
ড্যানিয়েল জর্

1
ভেরিয়েবলগুলি তাত্ত্বিকভাবে পার্শ্ব প্রতিক্রিয়া থেকে মুক্ত থাকার ক্ষেত্রে, আমি কেবল এটি বলতে চাই: সর্বদা মিথ্যা বন্ধুদের থেকে সাবধান থাকুন
জাস্টিন সময়

8

অন্য কোনও উত্তরই এই প্রশ্নটি মোকাবেলার চেষ্টা করেনি: একটি ভাষার নকশায় কতটা বাড়াবাড়ি হওয়া উচিত? কারণ আপনি যদি এমন কোনও ভাষা ডিজাইন করতে পারেন যা x = sqrt yএক্স এর y এর বর্গমূলের সাথে সেট করে, এর অর্থ এই নয় যে আপনার অগত্যা উচিত।

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

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


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

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

@leftaroundabout: অনুরূপভাবে, যদি আমি একটি ভাষা নকশা থাকতাম, আমার প্রয়োজন সম্ভবত হবে ()শূন্য যুক্তি ফাংশনের আবাহন কিন্তু এছাড়াও একটি ফাংশন "এর ঠিকানা নিতে" থেকে একটি টোকেন প্রয়োজন। পূর্ববর্তী ক্রিয়াটি অনেক বেশি সাধারণ, তাই কম সাধারণ ক্ষেত্রে একটি টোকেন সংরক্ষণ করা এতটা কার্যকর নয়।
সুপারক্যাট

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

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

5

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


ভিজ্যুয়াল বেসিক, বিভিন্ন রূপে, এমন কোনও পদ্ধতির মধ্যে পার্থক্য করে যা কোনও মান এবং ফাংশন দেয় না।

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

এটি তুলনামূলকভাবে অপ্রয়োজনীয় পার্থক্য যা দুটি ফর্মের মধ্যে ম্যানুয়াল রিফ্যাক্টরিংকে যতটা বেদনাদায়ক করে তুলবে তা তোলে।

(অন্যদিকে ভিসুয়াল বেসিক একই ডান বন্ধনী ব্যবহার ()ফাংশন কলের জন্য যেমন অ্যারে রেফারেন্সের জন্য, তাই অ্যারের রেফারেন্স ফাংশন কল মত চেহারা। এটি এমন একটি ফাংশন কল মধ্যে একটি অ্যারের ম্যানুয়াল refactoring হওয়া সত্ত্বেও! সুতরাং, আমরা চিন্তা করতে পারে অন্যান্য ভাষায় ব্যবহার []এর অ্যারে রেফারেন্সের জন্য, তবে আমি ডিগ্রি করি ...)


সি এবং সি ++ ভাষায় ভেরিয়েবলের বিষয়বস্তু তাদের নাম ব্যবহার করে স্বয়ংক্রিয়ভাবে অ্যাক্সেস করা হয় এবং আপনি যদি এর বিষয়বস্তুর পরিবর্তে ভেরিয়েবলটি উল্লেখ করতে চান তবে আপনি ইউনারি &অপারেটর প্রয়োগ করেন ।

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

এটি পুরোপুরি প্রশংসনীয় (যেমন এর জন্য অন্যান্য সিনট্যাকটিক পছন্দগুলিও রয়েছে)।


2
অবশ্যই, ভিজ্যুয়াল বেসিকের পদ্ধতি কলগুলিতে বন্ধনীগুলির অভাব তার ফাংশন কলগুলির সাথে তুলনা করার ক্ষেত্রে একটি অপ্রয়োজনীয় পার্থক্য, তাদের মধ্যে প্রয়োজনীয় বন্ধনী যুক্ত করা বিবৃতিগুলির মধ্যে একটি অপ্রয়োজনীয় পার্থক্য হতে পারে , যার মধ্যে অনেকগুলি বেসিক থেকে প্রাপ্ত ভাষায় প্রভাব রয়েছে যা খুব কার্যকর পদ্ধতির স্মরণ করিয়ে দেয়। আমি যখন এমএস বেসিক সংস্করণে কোনও কাজ করেছিলাম তখনও এটি হয়ে গেছে তবে এটি এখনও সিনট্যাক্সের অনুমতি দেয় না call <procedure name> (<arguments>)? খুব নিশ্চিত যে আমি যখন অন্য জীবদ্দশায় কুইকব্যাসিক প্রোগ্রামিং করছিলাম তখন পদ্ধতিগুলি ব্যবহারের একটি বৈধ উপায় ছিল ...
পেরিটা ব্রেটা

1
@ পেরিটাব্রেটা: ভিবি এখনও "কল" সিনট্যাক্সের অনুমতি দেয় এবং কখনও কখনও এটির ক্ষেত্রে প্রয়োজন হয় যেখানে জিনিসটি ডাকা উচিত তা একটি অভিব্যক্তি [উদাহরণস্বরূপ কেউ "যদি কল করতে পারেন (কিছু শর্ত, ডেলিগেট 1, ডেলিগেট 2) (তর্ক)" তবে সরাসরি কোনও "যদি" অপারেটরের ফলাফলের প্রার্থনা স্থির বিবৃতি হিসাবে বৈধ হবে না]।
সুপারক্যাট

@ পেরিটাব্রেট্টা আমি ভিবি 6 এর কোনও বন্ধনী প্রক্রিয়া কল পছন্দ করেছি কারণ এটি ডিএসএল-এর মতো কোডটি দেখতে দুর্দান্ত দেখায়।
মার্ক হার্ড

লিনকপ্যাডে @ সুপের্যাট, এটি আশ্চর্যজনক যে আমাকে এমন Callকোনও পদ্ধতির জন্য কত ঘন ঘন ব্যবহার করতে হবে যেখানে আমার প্রায়শই "স্বাভাবিক" প্রডাকশন কোডের প্রয়োজন হয় না।
মার্ক হার্ড

5

ধারাবাহিকতা এবং পাঠযোগ্যতা।

যদি আমি জানতে পারি যে, আপনি ফাংশন কল Xভালো: X(arg1, arg2, ...)অতঃপর আমি তা কোন যুক্তি জন্য একই ভাবে কাজ করে আশা: X()

এখন একই সময়ে আমি শিখেছি যে আপনি কিছু চিহ্ন হিসাবে পরিবর্তনশীল সংজ্ঞায়িত করতে পারেন, এবং এটি এটি ব্যবহার করুন:

a = 5
b = a
...

এখন যখন আমি এটি খুঁজে পাব তখন আমি কী ভাবব?

c = X

তোমার ধারণা আমারটার মতই ভালো। সাধারণ পরিস্থিতিতে, এটি Xএকটি পরিবর্তনশীল। তবে আমরা যদি আপনার পথ অবলম্বন করি তবে এটি একটি ফাংশনও হতে পারে! আমি কি মনে করতে পারি যে কোন চিহ্নটি কোন গ্রুপে (ভেরিয়েবল / ফাংশন) মানচিত্র করে?

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

পার্শ্ব-নোট 1: অন্যান্য উত্তরগুলি আরও একটি জিনিস পুরোপুরি উপেক্ষা করে: ভাষা আপনাকে ফাংশন এবং ভেরিয়েবল উভয়ের জন্য একই নাম ব্যবহার করতে দেয় এবং প্রসঙ্গে আলাদা করতে পারে। Common Lispএকটি উদাহরণ হিসাবে দেখুন । ফাংশন xএবং ভেরিয়েবল xপুরোপুরি ঠিক আছে।

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

এবং যে কোনও উপায়ে, আপনি ফাংশন এবং ভেরিয়েবলগুলির জন্য পৃথক নেমস্পেসের ক্ষমতা হারাবেন।


হা. ধারাবাহিকতা একটি যথেষ্ট যথেষ্ট কারণ, পুরো স্টপ (আপনার অন্যান্য পয়েন্টগুলি বৈধ নয় - তা হ'ল)।
ম্যাথু 21 ই

4

অন্যান্য উত্তর যুক্ত করতে, এই সি উদাহরণ গ্রহণ করুন:

void *func_factory(void)
{
        return 0;
}

void *(*ff)(void);

void example()
{
        ff = func_factory;
        ff = func_factory();
}

যদি অনুরোধ অপারেটরটি alচ্ছিক হয় তবে ফাংশন অ্যাসাইনমেন্ট এবং ফাংশন কলের মধ্যে পার্থক্য করার কোনও উপায় ছিল না।

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


3
জাভাস্ক্রিপ্টে কোনও টাইপ সিস্টেমের অভাব নেই। এটির ধরণের ঘোষণার অভাব রয়েছে । তবে এটি বিভিন্ন ধরণের মানের মধ্যে পার্থক্য সম্পর্কে পুরোপুরি অবগত।
পেরিটা ব্রেটাটা

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

উদাহরণস্বরূপ, এই ফাংশনটি কী করে? function cross(a, b) { return a + b; }
মার্ক কে কোয়ান

@ মারককোয়ান এটি অনুসরণ করে: ecma-international.org/ecma-262/6.0/…
curiousdannii
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.