নামযুক্ত ফাংশনগুলি সংজ্ঞায়িত করার জন্য ডুপ্লিকেট সিনট্যাক্সটি কী একটি খারাপ ভাষা নকশার সিদ্ধান্ত?


9

আমি মজাদার জন্য একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ মডেলিং করছি, এবং সিনট্যাক্সটি স্কালার দ্বারা অত্যন্ত প্রভাবিত - বিশেষত ফাংশন সংজ্ঞা।

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

ফলাফলটি হ'ল নিম্নলিখিত দুটি সংজ্ঞা একই জিনিস বোঝায়:

def square(x: Int) = x*x

val square = (x: Int) => x*x

সেখানে আধুনিক ফর্ম জন্য কোনো কারণ (তাৎক্ষণিক বেনামী ফাংশন নিয়োগ) কোন স্বাভাবিক অবস্থায় ব্যবহার করা - এটা কেবল এর সম্ভাব্য পরিবর্তে এটি ব্যবহার করতে defফর্ম।

নামযুক্ত ফাংশন সংজ্ঞায়িত করার জন্য এ জাতীয় সদৃশ সিনট্যাক্স থাকলে ভাষার অরথোগোনালটি বা অন্য কোনও ডিজাইনের দিকটিকে আঘাত করবে?

আমি এই সমাধানটি পছন্দ করি কারণ এটি পদ্ধতির সংক্ষিপ্ত এবং স্বজ্ঞাত সংজ্ঞা এবং নামযুক্ত ফাংশনগুলির (মাধ্যমে def) এবং বেনাম ফাংশনগুলির সংক্ষিপ্ত সংজ্ঞা (ব্যবহার করে =>) অনুমতি দেয়।

সম্পাদনা: Scala করে দুটোর মধ্যে পার্থক্য আছে - anonymous ফাংশন সংজ্ঞায়িত পদ্ধতি মত নয় defScala হবে। পার্থক্য যদিও তুলনামূলকভাবে সূক্ষ্ম - আমি পোস্ট লিঙ্ক আগে দেখুন।


However, assigning existing functionsমনে হচ্ছে বাক্যটির শেষ নেই
ইজকাটা

1
আপনি আপনার valস্বরলিপি ব্যবহার করে পুনরাবৃত্ত ফাংশন সংজ্ঞায়িত করতে পারেন ?
জর্জিও

2
আমি যাচাই করেছি যে স্কালায় এটিও সম্ভব। এসএমএলে এটি হয় না এবং আপনাকে funপুনরাবৃত্ত ফাংশন সংজ্ঞায়িত করতে ব্যবহার করতে হবে।
জর্জিও

3
দ্বিতীয় রূপটি আসলে একটি বিশেষ সিনট্যাক্টিকাল কাঠামো নয়, উপায় def। এটি কেবলমাত্র একটি পার্শ্ব প্রতিক্রিয়া যা একটি বেনাম ফাংশন, বলে (x : Int) => x + 1একটি বস্তু, এবং অবজেক্টগুলি মান সহ নির্ধারিত হতে পারে val f = ...। ভাষা ডিজাইনারদের সিনট্যাক্সটি অস্বীকার করার জন্য তাদের উপায়ের বাইরে চলে যেতে হত । এটি সম্পূর্ণরূপে একই নয় যে দুটি ভিন্ন বাক্য গঠন যা (প্রায়) একই জিনিসটিকে সমর্থন করার জন্য স্পষ্টভাবে প্রচেষ্টা চালিয়ে যায়।
কেচালোক্স

3
কোনও ভাষায় একাধিক উপায়ে কিছু করার বড় সুবিধা
হ'ল অনুচিতিক

উত্তর:


3

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

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

আসলে, আপনি এই নীতিটি কেবল নামযুক্ত ফাংশনগুলিতেই প্রয়োগ করতে পারবেন না, কোনও ফাংশনেও প্রয়োগ করতে পারেন । নামকরণ কার্যাবলী এবং বেনামে কার্যকারিতা সংজ্ঞায়নে কেন কোনও পার্থক্য রয়েছে? ইন লিমা ফাংশন সবসময় ভালো সংজ্ঞায়িত করা হয়: fn[<arguments>: <statements>]। যদি আপনি চান এটি "নামে" হতে যদি আপনি একটি পরিবর্তনশীল তা ধার্য করতে পারেন: var x = fn[<arguments: <statements>], ও বেনামে অন্য ফাংশন এটা পাস যদি আপনি চান: function[fn[<arguments: <statements>]]। আপনি যদি এটি উত্তোলন করতে চান তবে এটি অবিচ্ছিন্ন করুন const var x = fn[<arguments: <statements>]। একক ফর্মটি স্পষ্ট করে দেয় যে তারা একই জিনিস বোঝায়।


এটি বেশ আকর্ষণীয় যা constউত্তোলনের কারণ, তবে এটি সঠিক ধারণা দেয়। জেএসে function myFuncউত্তোলন ঘটায়, তবে var myFunc =তা হয় না, যা সম্ভবত কিছুটা স্বজ্ঞাত যা তারা অন্যথায় অন্যরকমভাবে আচরণ করে।
এমপেন

1
হ্যাঁ, আসলে জাভাস্ক্রিপ্ট মূলত একই জিনিস করে। function fnName()...ফর্ম আসলে একটি ধ্রুবক, যা কি এটা দিয়ে কি করে একটি বৈধ জিনিস উত্তোলন তোলে তৈরি নেই। আপনি যখন ফর্মটি ব্যবহার করেন তখন জাভাস্ক্রিপ্ট জিনিসগুলিকে বেশ বিভ্রান্ত করে তোলে var fn = function anotherFnName()...কারণ এটি নামটি উত্তোলন করে anotherFnName না , এমনকি এটি পরিষ্কারভাবে স্থির থাকে।
বিটি

2

আপনি যা পোস্ট করেছেন তা বৈধ স্কেল এবং দুর্দান্ত কাজ করে।

দ্বিগুণ হওয়ার কারণে স্কেল (আমার জ্ঞানের) সাথে সমস্যা সৃষ্টি হয়নি, আমি এটা বলতে যাচ্ছি যে এটি আপনার ভাষার পক্ষেও সমস্যা হবে না।


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

2

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

মূলত, কেবলমাত্র পদ্ধতিগুলিই পারে return- এবং যখন কী-ওয়ার্ডটি ল্যাম্বডা থেকে ব্যবহৃত হয়, এটি আসলে ঘেরাও পদ্ধতি থেকে ফিরে আসে।

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

বিস্তারিত

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