বেনামে ফাংশন শর্টহ্যান্ড


85

সংক্ষিপ্ত স্বরলিপি ব্যবহার করে বেনাম ফাংশন সম্পর্কে এমন কিছু আছে যা আমি বুঝতে পারি না (..)

নিম্নলিখিত কাজগুলি:

REPL>  ((fn [s] s) "Eh")
"Eh"

তবে এটি হয় না:

REPL>  (#(%) "Eh")

এইটা কাজ করে:

REPL> (#(str %) "Eh")
"Eh"

আমি যা বুঝতে পারি না তা হ'ল কেন (# (%) "এহ") কাজ করে না এবং একই সাথে আমারও স্ট্র ইন ((এফএন [গুলি] "" এহ ") ব্যবহার করার দরকার নেই

তারা উভয়ই বেনাম ফাংশন এবং তারা উভয়ই এখানে, একটি প্যারামিটার নেয়। অন্য স্বরলিপিটি না করে কেন শর্টহ্যান্ড স্বরলিপিটির একটি ক্রিয়াকলাপের প্রয়োজন?

উত্তর:


126
#(...)

সংক্ষিপ্ত

(fn [arg1 arg2 ...] (...))

(যেখানে দেহে আপনার কত% এন রয়েছে তার উপর আরগন সংখ্যা নির্ভর করে)। সুতরাং আপনি যখন লিখুন:

#(%)

এটি অনুবাদ:

(fn [arg1] (arg1))

লক্ষ্য করুন যে এটি আপনার প্রথম বেনাম ফাংশন থেকে আলাদা, যা এর মতো:

(fn [arg1] arg1)

আপনার সংস্করণটি arg1 কে একটি মান হিসাবে প্রত্যাবর্তন করে, শর্টহ্যান্ড প্রসারিত থেকে যে সংস্করণ আসে তা এটিকে একটি ফাংশন হিসাবে কল করার চেষ্টা করে। আপনি একটি ত্রুটি পান কারণ একটি স্ট্রিং বৈধ ফাংশন নয়।

যেহেতু শর্টহ্যান্ড শরীরের চারপাশে একটি প্রথম বন্ধনী সরবরাহ করে, এটি কেবলমাত্র একটি একক ফাংশন কল বা বিশেষ ফর্মটি সম্পাদন করতে ব্যবহৃত হতে পারে।


65

অন্য উত্তরগুলি ইতিমধ্যে খুব সুন্দরভাবে উল্লেখ করেছে যে #(%)আপনি পোস্ট করেছেন প্রকৃতপক্ষে এমন কিছুতে প্রসারিত (fn [arg1] (arg1)), যা মোটেও একই নয় (fn [arg1] arg1)

@ জন ফ্ল্যাটনেস নির্দেশ করেছেন যে আপনি কেবল ব্যবহার করতে পারেন identity তবে আপনি যদি প্রেরণ ম্যাক্রো ব্যবহার identityকরে লেখার কোনও উপায় খুঁজছেন তবে আপনি #(...)এটি এটি করতে পারেন:

#(-> %)

থ্রেডিং#(...) ম্যাক্রোর সাথে প্রেরণ ম্যাক্রোর সংমিশ্রণের মাধ্যমে এটি এমন কিছুতে প্রসারিত হয় যা আবার প্রসারিত হয় , যা আপনি চাইতেন কেবল তাই চান। আমি এবং ম্যাক্রো কম্বোকে ভ্যাক্টরগুলি ফিরিয়ে দেওয়ার সহজ ফাংশনগুলি লেখার জন্য সহায়কও পাই find->(fn [arg1] (-> arg1))(fn [arg1] arg1)->#(...)

#(-> [%2 %1])

21

আপনি যখন ব্যবহার করবেন #(...), আপনি কল্পনা করতে পারেন পরিবর্তে লিখছেন (fn [args] (...)), সহ প্রথম বন্ধনী ডান পাউন্ড পর শুরু করেন।

সুতরাং, আপনার কর্মহীন উদাহরণ রূপান্তরিত করে:

((fn [s] (s)) "Eh")

যা সম্ভবত কাজ করে না কারণ আপনি স্ট্রিংটিকে "এহ" বলার চেষ্টা করছেন । strকাজের সাথে আপনার উদাহরণ কারণ এখন আপনার ফাংশনটির (str s)পরিবর্তে (s)(identity s)এটি আপনার প্রথম উদাহরণের নিকটতম অ্যানালগ হতে পারে, যেহেতু এটি স্ট্রিংকে বাধ্য করে না।

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

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