এলিক্সিরে কেন দুই ধরণের ফাংশন রয়েছে?


279

আমি এলিক্সির শিখছি এবং কেন এটির দুই ধরণের ফাংশন সংজ্ঞা রয়েছে:

  • মডিউলে ফাংশন সংজ্ঞায়িত করা হয় def, যাকে ব্যবহার বলা হয়myfunction(param1, param2)
  • বেনামে ফাংশন সংজ্ঞায়িত fn, ব্যবহার করা হয়myfn.(param1, param2)

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

এতে দুটি ধরনের ফাংশন থাকার এবং অন্য ফাংশনগুলিতে প্রেরণ করার জন্য এক ধরণের থেকে অন্য ধরণের রূপান্তরিত হওয়ার কোনও সুবিধা রয়েছে? ফাংশনগুলি কল করার জন্য দুটি পৃথক স্বীকৃতি পাওয়ার কোনও সুবিধা রয়েছে কি?

উত্তর:


386

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

দ্বিতীয়টি দিয়ে শুরু করা যাক fn,। fnএটি একটি বন্ধ, lambdaরুবির মতোই । আমরা এটি নিম্নলিখিত হিসাবে তৈরি করতে পারি:

x = 1
fun = fn y -> x + y end
fun.(2) #=> 3

একটি ফাংশনে একাধিক ধারা থাকতে পারে:

x = 1
fun = fn
  y when y < 0 -> x - y
  y -> x + y
end
fun.(2) #=> 3
fun.(-2) #=> 3

এখন, কিছু আলাদা চেষ্টা করা যাক। আসুন বিভিন্ন সংখ্যার যুক্তি প্রত্যাশা করে বিভিন্ন ক্লজ সংজ্ঞায়িত করার চেষ্টা করুন:

fn
  x, y -> x + y
  x -> x
end
** (SyntaxError) cannot mix clauses with different arities in function definition

ওহ না! আমরা একটি ত্রুটি পেতে! আমরা এমন ধারাগুলিকে মিশ্রিত করতে পারি না যা বিভিন্ন সংখ্যক যুক্তি আশা করে। একটি ফাংশনের সর্বদা একটি স্থির আধ্যাত্মিকতা থাকে।

এখন, নামযুক্ত কার্যাবলী সম্পর্কে কথা বলা যাক:

def hello(x, y) do
  x + y
end

প্রত্যাশিত হিসাবে, তাদের একটি নাম রয়েছে এবং তারা কিছু যুক্তিও পেতে পারে। তবে এগুলি বন্ধ নয়:

x = 1
def hello(y) do
  x + y
end

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

আমরা বেনামি ফাংশন হিসাবে উপরে নামকরণের হ্যালো ফাংশনটি পুনরুদ্ধার করতে পারি। আপনি নিজেই এটি উল্লেখ করেছেন:

other_function(&hello(&1))

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

এলিক্সির v0.10.1 থেকে, নামযুক্ত ফাংশনগুলি ক্যাপচারের জন্য আমাদের কাছে একটি সিনট্যাক্স রয়েছে:

&hello/1

এটি স্থানীয় নামের ফাংশন হ্যালোকে বিনয়ের সাথে ক্যাপচার করবে the ভাষা এবং এর ডকুমেন্টেশন জুড়ে এই hello/1বাক্য গঠনতে ফাংশন সনাক্ত করা খুব সাধারণ বিষয় ।

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

সামগ্রিকভাবে, আমাদের দুটি কার্যকারিতা হ'ল এবং সেগুলি কেন অন্যরকম আচরণ করে those


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

17
এটি অর্থে কোনও বাস্তবায়ন বাধা নয় যে এটি f()(বিনা ছাড়াই) কাজ করতে পারে ।
জোসে ওলিম

6
আপনি is_function/2গার্ড ব্যবহার করে যুক্তির সংখ্যার সাথে মিল রাখতে পারেন match is_function(f, 2)এটির
আধ্যাত্মিকতা

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

28
এরলংয়ে, বেনামে ফাংশন কল এবং নিয়মিত ফাংশনগুলি ইতিমধ্যে সিন্টেক্সিকভাবে পৃথক: SomeFun()এবং some_fun()। এলিক্সির মধ্যে, আমরা যদি বিন্দুটি সরিয়ে ফেলি তবে সেগুলি একই হবে some_fun()এবং some_fun()কারণ ভেরিয়েবলগুলি ফাংশন নাম হিসাবে একই শনাক্তকারী ব্যবহার করে। অতএব বিন্দু।
জোসে ভলিম

17

আমি জানি না এটি অন্য কারও পক্ষে কতটা কার্যকর হবে তবে আমি অবশেষে যেভাবে ধারণাটি ঘিরে আমার মাথা গুটিয়েছি তা বুঝতে পেরেছিল যে অমৃত কার্যগুলি ফাংশন নয়।

অমৃতের প্রতিটি জিনিসই একটি অভিব্যক্তি। সুতরাং

MyModule.my_function(foo) 

কোনও ফাংশন নয় তবে কোডটি সম্পাদন করে এক্সপ্রেশনটি ফিরে আসে my_function। একটি "ফাংশন" পাওয়ার জন্য কেবলমাত্র একটি উপায় যা আপনি একটি যুক্তি হিসাবে ঘুরে দেখতে পারেন এবং তা হল বেনামে ফাংশন স্বরলিপি ব্যবহার করা।

এটি ফাংশন পয়েন্টার হিসাবে fn বা & স্বরলিপি উল্লেখ করার জন্য লোভনীয়, তবে এটি আসলে আরও অনেক বেশি। এটি পার্শ্ববর্তী পরিবেশের একটি বন্ধ।

আপনি যদি নিজেকে জিজ্ঞাসা করেন:

এই স্পটে আমার কি কার্যকর করার পরিবেশ বা ডেটা মান দরকার?

এবং আপনার যদি ফাঁসির কার্যকর প্রয়োগ দরকার হয় তবে বেশিরভাগ অসুবিধাগুলি আরও স্পষ্ট হয়ে যায়।


2
এটি পরিষ্কার যে MyModule.my_function(foo)এটি একটি অভিব্যক্তি তবে MyModule.my_function"পারত" এমন একটি ভাব ছিল যা কোনও ফাংশন "অবজেক্ট" ফেরত দেয়। তবে যেহেতু আপনাকে আরটিটি বলতে হবে, তার MyModule.my_function/1পরিবর্তে আপনার মতো কিছু দরকার হবে। এবং আমি অনুমান করি যে তারা সিদ্ধান্ত নিয়েছেন &MyModule.my_function(&1) যে এর পরিবর্তে এমন একটি বাক্য গঠন ব্যবহার করা ভাল যা অভিমান প্রকাশ করতে দেয় (এবং অন্যান্য উদ্দেশ্যগুলিও পরিবেশন করে)। ()নামযুক্ত ফাংশনগুলির জন্য .()অপারেটর এবং নামবিহীন ফাংশনের জন্য অপারেটর কেন রয়েছে তা এখনও স্পষ্ট নয়
রুবেলগুনা

আমার মনে হয় আপনি চাইছেন: &MyModule.my_function/1আপনি কীভাবে এটি কোনও ফাংশন হিসাবে পাস করতে পারবেন তা ঠিক।
jnmandal

14

এর ব্যাখ্যা এত জটিল কেন আমি কখনই বুঝতে পারি নি।

এটি রুবি-স্টাইলে "পেরেন্স ছাড়াই ফাংশন এক্সিকিউশন" এর বাস্তবতার সাথে মিলিত কেবলমাত্র একটি ব্যতিক্রমী ছোট পার্থক্য।

তুলনা করা:

def fun1(x, y) do
  x + y
end

প্রতি:

fun2 = fn
  x, y -> x + y
end

যদিও এই দুটোই কেবল সনাক্তকারী ...

  • fun1একটি আইডেন্টিফায়ার সংজ্ঞায়িত একটি নামাঙ্কিত ফাংশন বর্ণনা করে যে def
  • fun2 হ'ল একটি শনাক্তকারী যা একটি চলক বর্ণনা করে (যা ফাংশনটিতে একটি রেফারেন্স ধারণ করে)।

আপনি যখন দেখেন fun1বা fun2অন্য কোনও অভিব্যক্তিতে এর অর্থ কী তা বিবেচনা করুন ? এই অভিব্যক্তিটি মূল্যায়ন করার সময়, আপনি কি রেফারেন্সড ফাংশনটি কল করেন বা আপনি কেবল স্মৃতি থেকে দূরে কোনও মূল্য উল্লেখ করেন?

সংকলনের সময় জানার মতো ভাল কোনও উপায় নেই। ভেরিয়েবল বাইন্ডিং কোনও সময় কোনও ফাংশনকে ছায়া দিয়েছিল কিনা তা জানতে রুবিতে ভেরিয়েবল নেমস্পেসকে অন্তর্নিম্ন করার বিলাসিতা রয়েছে। এলিক্সির, সংকলিত হচ্ছে, এটি সত্যিই এটি করতে পারে না। এটিই ডট-নোটেশনটি করে, এটি এলিক্সিরকে বলে যে এটিতে কোনও ফাংশন উল্লেখ থাকতে হবে এবং এটি বলা উচিত called

এবং এটি সত্যিই কঠিন। কল্পনা করুন যে এখানে কোনও বিন্দু চিহ্ন নেই। এই কোডটি বিবেচনা করুন:

val = 5

if :rand.uniform < 0.5 do
  val = fn -> 5 end
end

IO.puts val     # Does this work?
IO.puts val.()  # Or maybe this?

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


12

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

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

my_function // argument
(function() {}) // argument

my_function() // function is called
(function() {})() // function is called

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

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

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

my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)

এখন কেউ শর্টকাট নিয়ে এসেছিল যা মূলত কোনও নামবিহীন একটি পদ্ধতির মতো দেখায়।

my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)

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

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

বাধ্যতামূলক বন্ধনীগুলি ভিএস কিছুটা আলাদা স্বরলিপি

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

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

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

যাইহোক ... এটি সুযোগের বাইরে।


9

এই আচরণ সম্পর্কে একটি দুর্দান্ত ব্লগ পোস্ট আছে: লিঙ্ক

দুই ধরণের ফাংশন

যদি কোনও মডিউলটিতে এটি থাকে:

fac(0) when N > 0 -> 1;
fac(N)            -> N* fac(N-1).

আপনি এটিকে শেলটি কেটে পেস্ট করতে পারবেন না এবং একই ফলাফল পাবেন।

এরলংয়ে একটি বাগ আছে বলেই এটি। Erlang মধ্যে মডিউল ক্রমের হয় ফরম । এরলং শেল এক্সপ্রেসনের একটি ক্রম মূল্যায়ন করে । এরলংয়ে ফর্মগুলি এক্সপ্রেশন নয় ।

double(X) -> 2*X.            in an Erlang module is a FORM

Double = fun(X) -> 2*X end.  in the shell is an EXPRESSION

দুটি একই নয়। এই বিড়ম্বনাটি চিরকালই এরলং হয়েছে তবে আমরা এটি লক্ষ্য করি নি এবং আমরা এটি নিয়ে বাঁচতে শিখেছি।

কল করতে বিন্দু fn

iex> f = fn(x) -> 2 * x end
#Function<erl_eval.6.17052888>
iex> f.(10)
20

স্কুলে আমি ফ (10) এফ (10) নয় (10) লিখে ফাংশনগুলি কল করতে শিখেছি - এটি শেল.এফ (10) এর মতো একটি নাম সহ "সত্যই" এটি (এটি শেলের মধ্যে সংজ্ঞায়িত একটি ফাংশন) শেলের অংশটি অন্তর্নিহিত তাই এটিকে কেবল চ (10) বলা উচিত।

আপনি যদি এটিকে ছেড়ে যান তবে আপনার জীবনের পরবর্তী কুড়ি বছর কেন তা ব্যাখ্যা করে ব্যয় করবেন expect


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

লিঙ্কটি এখন মারা গেছে :(
অনিলরেডশিফট

2

এলিক্সির 0 টি আরটি সহ ফাংশন সহ ফাংশনগুলির জন্য alচ্ছিক ধনুর্বন্ধনী রয়েছে। আসুন কেন এটি পৃথক কলিং সিনট্যাক্সকে গুরুত্বপূর্ণ করে তোলে তার একটি উদাহরণ দেখুন:

defmodule Insanity do
  def dive(), do: fn() -> 1 end
end

Insanity.dive
# #Function<0.16121902/0 in Insanity.dive/0>

Insanity.dive() 
# #Function<0.16121902/0 in Insanity.dive/0>

Insanity.dive.()
# 1

Insanity.dive().()
# 1

2 ধরণের ফাংশনের মধ্যে পার্থক্য না করে আমরা এর Insanity.diveঅর্থ কী বলতে পারি না : নিজেই একটি ফাংশন পাওয়া, এটি কল করা, বা ফলস্বরূপ বেনামী ফাংশনটি কল করা।


1

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

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

শর্টহ্যান্ড ফাংশন সংজ্ঞা (ফানক (& 1), ইত্যাদি) করতে অভ্যস্ত হওয়া এক ধরণের অদ্ভুত, তবে আপনি যখন নিজের কোডটি সংক্ষিপ্তভাবে পাইপ করার বা রাখার চেষ্টা করছেন তখন সহজ।


0

কেবলমাত্র দ্বিতীয় ধরণের ক্রিয়াটি প্রথম শ্রেণির অবজেক্ট বলে মনে হয় এবং এটি অন্য ক্রিয়াকলাপ হিসাবে প্যারামিটার হিসাবে পাস হতে পারে। মডিউলে সংজ্ঞায়িত একটি ফাংশন একটি এফএনএল আবৃত করা প্রয়োজন। এমন কিছু সিনট্যাকটিক চিনি রয়েছে যা দেখতে otherfunction(myfunction(&1, &2))এটিকে সহজ করার জন্য দেখতে ভাল লাগে তবে কেন এটি প্রথমে প্রয়োজনীয়? কেন আমরা শুধু করতে পারি না otherfunction(myfunction))?

আপনি করতে পারেন otherfunction(&myfunction/2)

যেহেতু এলিক্সার বন্ধনী (যেমন myfunction) ছাড়াই ফাংশন সম্পাদন করতে পারে , otherfunction(myfunction))এটি ব্যবহার করে কার্যকর করার চেষ্টা করা হবে myfunction/0

সুতরাং, আপনাকে ক্যাপচার অপারেটরটি ব্যবহার করতে হবে এবং আরটি সহ ফাংশন নির্দিষ্ট করতে হবে, কারণ একই নামের সাথে আপনার বিভিন্ন ফাংশন থাকতে পারে। এইভাবে &myfunction/2,।

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