বেশিরভাগ প্রোগ্রামিং ভাষার কার্যকারিতা ঘোষণার জন্য বিশেষ কীওয়ার্ড বা বাক্য গঠন রয়েছে? [বন্ধ]


39

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

পাইথনে উদাহরণস্বরূপ:

x = 2
y = addOne(x)
def addOne(number): 
  return number + 1

কেন না:

x = 2
y = addOne(x)
addOne = (number) => 
  return number + 1

একইভাবে, জাভা মত একটি ভাষায়:

int x = 2;
int y = addOne(x);

int addOne(int x) {
  return x + 1;
}

কেন না:

int x = 2;
int y = addOne(x);
(int => int) addOne = (x) => {
  return x + 1;
}

এই বাক্য গঠনটি কোনও কিছু ঘোষণার আরও প্রাকৃতিক উপায় বলে মনে হচ্ছে (এটি কোনও ফাংশন বা পরিবর্তনশীল হোক) এবং একটির মতো কম শব্দ যেমন defবা functionকিছু ভাষায়। এবং, আইএমও, এটি আরও সামঞ্জস্যপূর্ণ (কোনও পরিবর্তনশীল বা ফাংশনের ধরণটি বোঝার জন্য আমি একই জায়গায় তাকাই) এবং সম্ভবত পার্সার / ব্যাকরণকে লেখার জন্য কিছুটা সহজ করে তোলে।

আমি জানি খুব কম ভাষা এই ধারণাটি ব্যবহার করে (কফিস্ক্রিপ্ট, হাস্কেল) তবে বেশিরভাগ সাধারণ ভাষায় ফাংশনের জন্য বিশেষ বাক্য গঠন রয়েছে (জাভা, সি ++, পাইথন, জাভাস্ক্রিপ্ট, সি #, পিএইচপি, রুবি)।

এমনকি স্কেলাতেও, যা উভয় উপায়ে সমর্থন করে (এবং প্রকারের অনুক্রমটি রয়েছে), এটি লেখার পক্ষে আরও সাধারণ:

def addOne(x: Int) = x + 1

বরং:

val addOne = (x: Int) => x + 1

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

val x: Int = 1
val y: Int = addOne(x)
val addOne: (Int => Int) = x => x + 1

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


9
কারণ সম্ভবত historicalতিহাসিক। যে কেহ প্রথমে এটি করেছে সেভাবেই করেছে এবং অন্য প্রত্যেকে অনুলিপি করেছে। তবে আমি সন্দেহ করি আমরা নিশ্চিতভাবে জানতে পারি।

29
আমি মনে করি এটি কারণ যে কোনও ফাংশন বা পদ্ধতি কেবল অন্য নামধারী সত্তা নয় । ক্রিয়ামূলক ভাষায়, এগুলি (আপনি এগুলি প্রায় পাশ করতে পারেন) তবে অন্যান্য ভাষায় (জাভা এর মতো) কোনও ফাংশন বা পদ্ধতি একটি সাধারণ ভেরিয়েবল থেকে সম্পূর্ণ আলাদা এবং এটিকে হিসাবে বিবেচনা করা যায় না (আমি স্বীকার করি জাভা 8 ধরণের এটি দুর্বল করে দেয়) বিবৃতি), সুতরাং তারা পৃথকভাবে আচরণ করার কারণে কার্য / পদ্ধতিগুলি আলাদাভাবে সংজ্ঞায়িত করা বোধগম্য হয় ।
11684

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

22
' ফাংশন ঘোষণার জন্য ' বিশেষ কীওয়ার্ড বা সিনট্যাক্স 'কীভাবে' => 'হয় না ?
টিএমএল

11
আমি আপনার সম্পর্কে জানি না, তবে আমার (int => int) addOne = (x) => {চেয়ে অনেক বেশি "বিশেষ" এবং "জটিল" int addOne(int) {...
বোগদান আলেকজান্দ্রু

উত্তর:


48

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

এবং এই ভাষায় ফাংশন হয় না শুধু আরেকটি মান:

  • সি ++, সি # এবং জাভাতে আপনি ফাংশনগুলি ওভারলোড করতে পারেন: একই নামের সাথে দুটি ফাংশন রাখতে পারেন তবে আলাদা স্বাক্ষর।
  • সি, সি ++, সি # এবং জাভাতে আপনার এমন মান থাকতে পারে যা ফাংশনকে উপস্থাপন করে তবে ফাংশন পয়েন্টার, ফান্টেক্টর, ডেলিগেটস এবং ফাংশনাল ইন্টারফেস সবই ফাংশন থেকে পৃথক। কারণটির অংশটি হ'ল তাদের বেশিরভাগগুলি আসলে কেবল ফাংশন নয়, তারা কিছু (মিউটেটেবল) রাষ্ট্রের সাথে একত্রে একটি ফাংশন।
  • ভেরিয়েবলগুলি ডিফল্টরূপে পরিবর্তনীয় হয় (আপনাকে ব্যবহার করতে হবে const, readonlyবা finalরূপান্তর নিষিদ্ধ করতে হবে), তবে ফাংশনগুলি পুনরায় নিয়োগ দেওয়া যাবে না।
  • আরও প্রযুক্তিগত দৃষ্টিকোণ থেকে কোড (যা ফাংশন নিয়ে গঠিত) এবং ডেটা পৃথক। এগুলি সাধারণত মেমোরির বিভিন্ন অংশ দখল করে এবং এগুলি পৃথকভাবে অ্যাক্সেস করা হয়: কোড একবার লোড করা হয় এবং তারপরে কেবল সম্পাদন করা হয় (তবে পড়া বা লিখিত হয় না), যদিও ডেটা প্রায়শই ক্রমাগত বরাদ্দ করা হয় এবং deallocated হয় এবং লিখিত ও পঠন করা হয়, তবে কখনও কার্যকর হয় না।

    এবং যেহেতু সি বোঝানো হয়েছিল "ধাতুর কাছাকাছি" তাই ভাষার বাক্য গঠনতেও এই পার্থক্যটি মিরর করে তোলে।

  • "ফাংশনটি কেবলমাত্র একটি মূল্য" পদ্ধতির যা কার্যকরী প্রোগ্রামিংয়ের ভিত্তি রূপ দেয় কেবলমাত্র তুলনামূলকভাবে সম্প্রতি সাধারণ ভাষাগুলিতে আকর্ষন লাভ করেছে, যেমন সি ++, সি # এবং জাভাতে ল্যাম্বডাসের দেরী প্রবর্তনের প্রমাণিত (2011, 2007, 2014)।


12
সি # এর বেনামে ফাংশন ছিল - যা কেবল টাইপ ইনফরমেশন এবং লম্বা সিনট্যাক্স ছাড়াই ল্যাম্বডাস - 2005 সাল থেকে
এরিক লিপার্ট

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

1
@ বেনজামিন গ্রুয়েনবাউম ভাষাটির স্তর সম্পর্কে নয়, মেমরির মধ্যে সংকলিত কোড সম্পর্কে কথা বলছিলাম।
এসভি

সি এর ফাংশন পয়েন্টার রয়েছে যা অন্তত সামান্য, অন্য একটি মান হিসাবে বিবেচিত হতে পারে। নিশ্চিত হওয়ার সাথে জড়িত হওয়ার জন্য একটি বিপজ্জনক মান, তবে অপরিচিত বিষয়গুলি ঘটেছে।
প্যাট্রিক হিউজেস

@ পেট্রিক হিউজেস হ্যাঁ, আমি আমার দ্বিতীয় বিষয়টিতে তাদের উল্লেখ করছি। তবে ফাংশন পয়েন্টারগুলি ফাংশন থেকে একেবারে পৃথক।
এসভি

59

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

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

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

আপনি যেভাবে অন্য প্রস্তাবিত সত্তা হিসাবে প্রস্তাব করছেন তার ফাংশনগুলি রাখার ফলে আপনার কোডটি দেখতে আরও শক্ত হয়ে উঠবে এবং এইভাবে বোঝা আরও শক্ত।


12
আমি একমত নই যে নামযুক্ত সত্তা হিসাবে ফাংশনগুলি চিকিত্সা করা কোডগুলি বোঝার জন্য প্রয়োজনীয় করে তোলে। প্রক্রিয়াগত দৃষ্টান্ত অনুসরণ করে এমন কোনও কোডের ক্ষেত্রে এটি প্রায় অবশ্যই সত্য, তবে কার্যকরী দৃষ্টান্ত অনুসরণ করে এমন কোডের ক্ষেত্রে এটি সত্য নাও হতে পারে।
কাইল স্ট্র্যান্ড

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

12
+1 টি। আরও সংক্ষিপ্ত সংস্করণ হতে পারে "সমস্ত প্রাকৃতিক ভাষা বিশেষ্যকে ক্রিয়া থেকে আলাদা করে কেন?"
এমএসডাব্লু

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

4
@MarcvanLeeuwen। আপনার মন্তব্যটি সত্য এবং বোধগম্য, তবে কিছুটা বিভ্রান্তি উত্সাহিত করা হয়েছে মূল পোস্টটি যেভাবে redacted হয় তার দ্বারা। আসলে 2 টি প্রশ্ন রয়েছে: (i) এটি কেন এইভাবে? এবং (ii) পরিবর্তে কেন এইভাবে নয়? । উত্তরটি whatsisnameপ্রথম পয়েন্টটিতে আরও সম্বোধন করা ছিল (এবং এই ব্যর্থতাগুলি অপসারণের কিছু বিপদ সম্পর্কে সতর্ক করে দেওয়া), যখন আপনার মন্তব্য প্রশ্নের দ্বিতীয় অংশের সাথে আরও সম্পর্কিত। প্রকৃতপক্ষে এই বাক্য গঠনটি পরিবর্তন করা সম্ভব (এবং আপনি যেমন বর্ণনা করেছেন, এটি ইতিমধ্যে অনেকবার হয়ে গিয়েছে ...) তবে এটি প্রত্যেকের পক্ষে মানায় না (যেমন ওওপ সবাইকে মানায় না
হকি

10

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

ফাংশন-প্রকারের নাম = ( পরামিতি-তালিকা ) ফলাফলের ধরণ : বডি ;

কংক্রিট আপনার উদাহরণ পড়তে হবে

PROC (INT)INT add one = (INT n) INT: n+1;

প্রাথমিক প্রকারটি ঘোষণার আরএইচএস থেকে পড়তে পারা যায় এবং অতিরিক্ত ফাংশন হওয়ার কারণে এটি সর্বদা শুরু হয় PROC, এটির (এবং সাধারণত) এটি চুক্তিবদ্ধ হতে পারে

PROC add one = (INT n) INT: n+1;

তবে মনে রাখবেন যে =এখনও প্যারামিটার তালিকার আগে আসে । এছাড়াও মনে রাখবেন যদি আপনি একটি ফাংশন চেয়েছিলেন পরিবর্তনশীল (যা একই ফাংশন ধরনের অন্য মান পরে নির্ধারিত করা যেতে পারে), =দ্বারা প্রতিস্থাপিত হবে :=, নয়তো এক দান

PROC (INT)INT func var := (INT n) INT: n+1;
PROC func var := (INT n) INT: n+1;

তবে এক্ষেত্রে উভয় রূপই সংক্ষেপে; যেহেতু সনাক্তকারী func varস্থানীয়ভাবে উত্পন্ন ফাংশনটির জন্য একটি রেফারেন্স নির্ধারণ করে, সম্পূর্ণরূপে প্রসারিত ফর্মটি হবে

REF PROC (INT)INT func var = LOC PROC (INT)INT := (INT n) INT: n+1;

এই নির্দিষ্ট সিনট্যাকটিক ফর্মটি অভ্যস্ত হওয়া সহজ তবে এটি অন্যান্য প্রোগ্রামিং ভাষায় স্পষ্টতই এর বৃহত্তর অনুসরণ করতে পারে নি। Haskell, মত এমনকি কার্মিক প্রোগ্রামিং ভাষা শৈলী পছন্দ f n = n+1সঙ্গে = নিম্নলিখিত পরামিতি তালিকা। আমি অনুমান করি কারণটি মূলত মনস্তাত্ত্বিক; পরে এমনকি গণিতবিদ প্রায়ই পছন্দ করা না, আমি কি হিসাবে, = এন + 1 টি ওভার ( এন ) = + 1 টি।

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

PROC (REAL) REAL f = IF mood=sunny THEN sin ELSE cos FI;

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


1
"গণিতবিদ পছন্দ করেন না = এন + + উপর 1 ( এন ) = + 1 টি" ... না পদার্থবিদদের, যারা শুধুমাত্র লিখতে চান উল্লেখ করতে = + 1 টি ...
leftaroundabout

1
@ লেফট্রাউন্ডেবাউট কারণ ⟼ লেখার জন্য ব্যথা। সত্যি বলতে.
পিয়ের আরলাড

8

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

স্কালায়, যার কার্যকারিতা এবং পদ্ধতি উভয়ই রয়েছে, পদ্ধতি এবং কার্যকারিতাগুলির মধ্যে নিম্নলিখিত পার্থক্য রয়েছে:

  • পদ্ধতি জেনেরিক হতে পারে, ফাংশনগুলি পারে না
  • পদ্ধতিগুলির মধ্যে একটি, এক বা একাধিক প্যারামিটারের তালিকা থাকতে পারে না, ফাংশনগুলিতে সর্বদা ঠিক এক প্যারামিটারের তালিকা থাকে
  • পদ্ধতিগুলির একটি অন্তর্নিহিত প্যারামিটার তালিকা থাকতে পারে, ফাংশনগুলি পারে না
  • পদ্ধতিতে ডিফল্ট আর্গুমেন্টগুলির সাথে alচ্ছিক পরামিতি থাকতে পারে, ফাংশনগুলি পারে না
  • পদ্ধতিগুলির পুনরাবৃত্তি পরামিতি থাকতে পারে, ফাংশনগুলি পারে না
  • পদ্ধতিতে নাম অনুসারে প্যারামিটার থাকতে পারে, ফাংশন থাকতে পারে না
  • পদ্ধতিগুলি নামযুক্ত আর্গুমেন্ট সহ কল ​​করা যেতে পারে, ফাংশনগুলি পারে না
  • ফাংশন বস্তু হয়, পদ্ধতি হয় না

সুতরাং, আপনার প্রস্তাবিত প্রতিস্থাপনটি সহজেই কাজ করে না, কমপক্ষে সেই ক্ষেত্রে।


2
"কার্যাদি বস্তু, পদ্ধতি অবজেক্টগুলির অন্তর্ভুক্ত।" এটি কি সমস্ত ভাষাতে প্রয়োগ করা উচিত (যেমন সি ++)?
সুইভ

9
"পদ্ধতিতে নাম অনুসারে প্যারামিটার থাকতে পারে, ফাংশনগুলি পারে না" - এটি পদ্ধতি এবং ফাংশনগুলির মধ্যে একটি মৌলিক পার্থক্য নয়, এটি স্কালার মাত্র একটি শিখর। অন্যদের বেশিরভাগ (সমস্ত?) সাথে একই।
ব্যবহারকারী 253751

1
পদ্ধতিগুলি মূলত কেবল একটি বিশেষ ধরণের ক্রিয়া। -1। নোট করুন যে জাভা (এবং এক্সটেনশন দ্বারা স্কালা) এর অন্য কোনও ধরণের ফাংশন নেই। এটি "ফাংশন" হ'ল একটি পদ্ধতিযুক্ত অবজেক্ট (সাধারণ ফাংশনে অবজেক্ট বা এমনকি প্রথম শ্রেণির মানও নাও হতে পারে; তারা ভাষার উপর নির্ভরশীল কিনা)।
জানু হুডেক

@ জানহুদেক: শব্দার্থগতভাবে, জাভাতে দুটি কার্য এবং পদ্ধতি রয়েছে; এটি ফাংশনগুলির উল্লেখ করার সময় এটি পরিভাষা "স্থিতিশীল পদ্ধতি" ব্যবহার করে তবে এ জাতীয় পরিভাষা শব্দার্থক পার্থক্য মুছে দেয় না।
সুপারক্যাট

3

যে কারণগুলি সম্পর্কে আমি ভাবতে পারি তা হ'ল:

  • আমরা কী ঘোষণা করছি তা সংকলকটির পক্ষে জানা সহজ।
  • এটি আমাদের জন্য গুরুত্বপূর্ণ (তুচ্ছভাবে) এটি কোনও ফাংশন বা পরিবর্তনশীল কিনা তা জানা আমাদের পক্ষে গুরুত্বপূর্ণ। ফাংশনগুলি সাধারণত ব্ল্যাক বক্স হয় এবং আমরা তাদের অভ্যন্তরীণ বাস্তবায়ন সম্পর্কে কোনও যত্ন করি না। আমি স্কালায় রিটার্নের ধরণগুলিতে টাইপ অনুকরণ পছন্দ করি না, কারণ আমার বিশ্বাস যে কোনও ফাংশনের রিটার্ন টাইপ ব্যবহার করা সহজ: এটি প্রায়শই কেবলমাত্র ডকুমেন্টেশন সরবরাহ করা হয়।
  • এবং সর্বাধিক গুরুত্বপূর্ণ হ'ল প্রোগ্রামিং ল্যাঙ্গুয়েজ ডিজাইনের ক্ষেত্রে ব্যবহৃত ভিড় কৌশলটি। সি ++ সি প্রোগ্রামারগুলি চুরি করার জন্য তৈরি করা হয়েছিল, এবং জাভা এমনভাবে তৈরি করা হয়েছিল যা সি ++ প্রোগ্রামারগুলিকে ভয় পায় না এবং জাভা প্রোগ্রামারদের আকর্ষণ করার জন্য সি #। এমনকি সি #, যা আমি মনে করি এটি খুব আধুনিক ভাষা যার পিছনে একটি আশ্চর্যজনক দল রয়েছে, জাভা বা সি থেকেও কিছু ভুল অনুলিপি করেছে

2
"… এবং সি # জাভা প্রোগ্রামারদের আকর্ষণ করার জন্য" - এটি প্রশ্নবিদ্ধ, সি # জাভার চেয়ে সি ++ এর সাথে অনেক বেশি মিল similar এবং কখনও কখনও দেখে মনে হয় এটি ইচ্ছাকৃতভাবে জাভা (কোনও ওয়াইল্ডকার্ডস, কোনও অভ্যন্তরীণ শ্রেণি, কোনও রিটার্ন টাইপ
কোভরিয়েন্স

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

2

প্রশ্নটি ঘুরিয়ে দেওয়া, যদি কেউ এমন কোনও মেশিনে সোর্স কোড সম্পাদনা করতে আগ্রহী না হন যা চূড়ান্ত র‌্যাম-সীমাবদ্ধ, বা ফ্লপি ডিস্কটি পড়তে সময় কমিয়ে দেয়, কীওয়ার্ড ব্যবহারে কী দোষ আছে?

অবশ্যই এটি পড়ার x=y+zচেয়ে সুন্দর store the value of y plus z into x, তবে এর অর্থ এই নয় যে বিরামচিহ্নগুলি অক্ষরগুলি মূলশব্দগুলির চেয়ে সহজাত "আরও ভাল"। যদি ভেরিয়েবলগুলি i, jএবং kহয় Integerএবং xহয় Realতবে পাস্কলে নিম্নলিখিত লাইনগুলি বিবেচনা করুন:

k := i div j;
x := i/j;

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

কয়েকটি প্রসঙ্গ আছে যেখানে ফাংশন সংজ্ঞা সংক্ষিপ্ত করতে এটি সহায়ক হতে পারে (যেমন একটি ল্যাম্বডা যা অন্য একটি এক্সপ্রেশনের অংশ হিসাবে ব্যবহৃত হয়), ফাংশনগুলি সাধারণত দাঁড় করায় এবং ফাংশন হিসাবে সহজেই চাক্ষুষরূপে চিহ্নিতযোগ্য বলে মনে করা হয়। যদিও পার্থক্যটি আরও সূক্ষ্ম করা সম্ভব এবং বিরামচিহ্নগুলি ছাড়া আর কিছুই ব্যবহার করা সম্ভব না, তবে কী হবে? বলার Function Foo(A,B: Integer; C: Real): Stringফলে এটি পরিষ্কার হয়ে যায় যে ফাংশনটির নাম কী, কী পরামিতিগুলি প্রত্যাশা করে এবং কী ফিরে আসে। হয়তো কেউ Functionকিছু বিরামচিহ্নের পরিবর্তে এটি ছয় বা সাত অক্ষর দ্বারা সংক্ষিপ্ত করতে পারে , তবে কী লাভ হবে?

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


3
আমি মনে করি না এই প্রশ্নটি সংক্ষিপ্ততার বিষয়ে। বিশেষত যেহেতু উদাহরণস্বরূপ void f() {}সি ++ ( auto f = [](){};), সি # ( Action f = () => {};) এবং জাভা ( Runnable f = () -> {};) এ ল্যাম্বডা সমতুল্য তুলনায় আসলে খাটো । ল্যাম্বডাসের সংক্ষিপ্ততা টাইপ অনুমিতি এবং বাদ দেওয়া থেকে আসে return, তবে আমি মনে করি না যে এটি এই প্রশ্নগুলির সাথে সম্পর্কিত।
সুইভ

2

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

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


1

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

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

তবে আপনার লক্ষ করা উচিত যে বেশিরভাগ ভাষায় defস্টাইল সিনট্যাক্স (অর্থাত্ প্রথাগত সিনট্যাক্স) স্ট্যান্ডার্ড ভেরিয়েবল অ্যাসাইনমেন্ট থেকে আলাদা আচরণ করে

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

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


1

কিছু ভাষার জন্য ফাংশন মান হয় না। এমন ভাষায় তা বলতে

val f = << i : int  ... >> ;

যদিও একটি ফাংশন সংজ্ঞা

val a = 1 ;

একটি ধ্রুবক ঘোষণা করে, বিভ্রান্তিকর কারণ আপনি দুটি জিনিস বোঝাতে একটি বাক্য গঠন ব্যবহার করছেন।

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

যদি, আপনার ভাষায়, ফাংশনগুলি প্রথম শ্রেণীর হয়, তবে কেন এমন সংশ্লেষ যথেষ্ট পরিমাণে সংক্ষিপ্ত আকারের সন্ধান করার চেষ্টা করবেন না যে আপনি সিনট্যাকটিক চিনির সন্ধান করতে প্ররোচিত হবেন না?

- সম্পাদনা করুন -

আর কেউ ইস্যু করে নি যে (এখনও) পুনরাবৃত্তি হয়। আপনি যদি অনুমতি দেয়

{ 
    val f = << i : int ... g(i-1) ... >> ;
    val g = << j : int ... f(i-1) ... >> ;
    f(x)
}

এবং আপনি অনুমতি দিন

{
    val a = 42 ;
    val b = a + 1 ;
    a
} ,

এটি কি আপনাকে অনুমতি দেয় তা অনুসরণ করে?

{
    val a = b + 1 ; 
    val b = a - 1 ;
    a
} ?

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

- সম্পাদনার সমাপ্তি -

* এটি যুক্তিযুক্ত হতে পারে যে হাস্কেল এই তালিকার অন্তর্ভুক্ত নয়। এটি কোনও ক্রিয়াকলাপটি ঘোষণার জন্য দুটি উপায় সরবরাহ করে তবে উভয়ই এক অর্থে অন্য ধরণের ধ্রুবকগুলি ঘোষণার জন্য বাক্য গঠনকে সাধারণীকরণ করা হয়


0

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

আপনার ক্ষেত্রে, 4 ভেরিয়েবল সহ একটি ফাংশন হবে:

(int, long, double, String => int) addOne = (x, y, z, s) => {
  return x + 1;
}

আমি যখন ফাংশন শিরোনামটি দেখি এবং (x, y, z, s) দেখি তবে এই ভেরিয়েবলগুলির প্রকারগুলি আমি জানি না। যদি আমি zতৃতীয় প্যারামিটারটির প্রকারটি জানতে চাই , আমাকে ফাংশনের শুরুটি দেখতে হবে এবং 1, 2, 3 গণনা শুরু করতে হবে এবং তারপরে টাইপটি দেখতে হবে double। পূর্বের উপায়ে আমি সরাসরি দেখি এবং দেখি double z


3
অবশ্যই টাইপ ইনফারেন্স নামে আশ্চর্যজনক জিনিস রয়েছে, যা আপনাকে নিজের পছন্দ মতো var addOne = (int x, long y, double z, String s) => { x + 1 }একটি অ-মরোনিক স্ট্যাটিকালি টাইপ করা ভাষায় (উদাহরণ: সি #, সি ++, স্কালা) মতো কিছু লিখতে দেয় । এমনকি সি # এর দ্বারা ব্যবহৃত অন্যথায় খুব সীমিত স্থানীয় প্রকারের অনুকরণও এর জন্য পুরোপুরি যথেষ্ট। সুতরাং এই উত্তরটি কেবল একটি নির্দিষ্ট সিনট্যাক্সের সমালোচনা করছে যা প্রথমে সন্দেহজনক, এবং বাস্তবে কোথাও ব্যবহার করা হয়নি (যদিও হাস্কেলের সিনট্যাক্সটির খুব একই রকম সমস্যা রয়েছে)।
আমন

4
@ এ্যামন তার উত্তর হয়ত বাক্য গঠনের সমালোচনা করতে পারে, তবে এটি আরও উল্লেখ করে যে প্রশ্নটির উদ্দেশ্যপূর্ণ বাক্য গঠন প্রত্যেকের কাছে "প্রাকৃতিক" নাও হতে পারে।

1
@amon প্রকারের অনুমিতকরণের উপযোগিতা প্রত্যেকের জন্য একটি দুর্দান্ত জিনিস নয় thing আপনি যদি কোডটি বেশিবার পড়ে থাকেন তবে কোডটি টাইপ করুন তবে টাইপ অনুমানটি খারাপ কারণ কোডটি পড়ার সময় আপনার মাথায় টাইপটি নির্ধারণ করতে হয়; এবং টাইপটি পড়ার উপায়টি আসলে কী ধরণের ব্যবহৃত হয় তা ভেবে দেখার চেয়ে আরও দ্রুত।
m3th0dman

1
সমালোচনা আমার কাছে বৈধ বলে মনে হচ্ছে। জাভা জন্য, ওপি মনে হয় [ইনপুট, আউটপুট, নাম, ইনপুট] একটি সহজ / পরিষ্কার ফাংশন ডিএফ কেবল [আউটপুট, নাম, ইনপুট] এর চেয়ে? @ এম থ্রিথডম্যান যেমন বলেছে, দীর্ঘ স্বাক্ষর সহ, ওপি'র 'ক্লিনার' পদ্ধতিটি খুব দীর্ঘায়িত হয়ে যায়।
মাইকেল 11

0

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

হাস্কেলের একটি বিশেষ মডেল রয়েছে যেখানে মূল্যায়ন এবং ঘোষণার মধ্যে কোনও পার্থক্য নেই, এ কারণেই একটি বিশেষ কীওয়ার্ডের প্রয়োজন নেই।


2
তবে ল্যাম্বদা ফাংশনের জন্য কিছু বাক্য গঠনও এটি সমাধান করে, তবে কেন এটি ব্যবহার করবেন না?
সোভিক

0

ফাংশনগুলি বেশিরভাগ ভাষায় আক্ষরিক, বস্তু ইত্যাদির থেকে পৃথকভাবে ঘোষিত হয় কারণ এগুলি আলাদাভাবে ব্যবহৃত হয়, আলাদাভাবে ডিবাগ হয় এবং ত্রুটির বিভিন্ন সম্ভাব্য উত্স তৈরি করে।

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

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

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