এলআইএসপি-র ম্যাক্রো কোন ক্ষেত্রে ডিএসএল তৈরির জন্য রুবির "ক্ষমতা" চেয়ে ভাল


21

রুবিকে জ্বলজ্বল করে তোলে এমন একটির মধ্যে ডোমেন নির্দিষ্ট ভাষাগুলি আরও ভাল তৈরি করার ক্ষমতা

যদিও ম্যাক্রোর মাধ্যমে কেউ এই লাইব্রেরিগুলি এলআইএসপিতে নকল করতে পারে তবে আমি মনে করি রুবির বাস্তবায়ন আরও মার্জিত is তবুও, আমি মনে করি যে এমন কিছু মামলা রয়েছে যেগুলি এলআইএসপি-র ম্যাক্রো রুবির চেয়ে ভাল হতে পারে, যদিও আমি এর একটিও ভাবতে পারি নি।

সুতরাং, কোন ক্ষেত্রে এলআইএসপি'র ম্যাক্রো ডিএসএল তৈরির জন্য রুবির "ক্ষমতা" এর চেয়ে ভাল, যদি থাকে?

হালনাগাদ

আমি এটি জিজ্ঞাসা করেছি কারণ আধুনিক প্রোগ্রামিং ভাষাগুলি LISP এককতার কাছে চলেছে , যেমন

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

আমি ভাবছিলাম যে এলআইএসপি-র ম্যাক্রো কেবলমাত্র বিশেষ ক্ষেত্রে প্রযোজ্য এবং অন্যান্য প্রোগ্রামিং ভাষার বৈশিষ্ট্যগুলি আজ সফ্টওয়্যার বিকাশে চ্যালেঞ্জগুলি মোকাবিলার জন্য বিমূর্ততা বাড়াতে যথেষ্ট শক্তিশালী।


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

রুবিতে এই জাতীয় কিছু বাস্তবায়নের চেষ্টা করুন: মেটা- বিকল্প বিকল্প //ffront.pdf
এসকে-যুক্তি

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

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

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

উত্তর:


23

লিপ অন পড়ুন এবং তারপরে নিজের জন্য সিদ্ধান্ত নিন।

আমার সংক্ষিপ্তসারটি হ'ল সুবিধাজনক সিনট্যাক্স সরবরাহে রুবি আরও ভাল। তবে লিস্প নতুন বিমূর্ততা তৈরি করার ক্ষমতাতে, এবং নীচে বিমূর্তনে অ্যাবস্ট্রাকশন স্তরটিতে জিতল hands তবে আপনাকে এই বিষয়টি বুঝতে অনুশীলনে লিপ্প দেখতে হবে। সুতরাং বই সুপারিশ।


1
"লেট ওভার ল্যাম্বদা" অনেক একই অনুরূপ স্থলটি জুড়ে। পড়ার প্রস্তাবও দেওয়া হচ্ছে।
জন আর স্ট্রোহম

But Lisp wins, hands down, at the ability to create new abstractions, and then to layer abstraction on abstraction.এখন আমি জানি কেন। । ।
ওনেসিমাসউনবাউন্ড

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

1
@ এসকে-যুক্তি: সত্য। তবে লিস্টাররা পাঠক ম্যাক্রো থেকে লজ্জা পান কারণ আপনি একবার সেই রাস্তায় নামলে এটি আর লিস্পের মতো মনে হয় না। বাস্তবে লিস্পের কিছু বৈকল্পিক যেমন ক্লোজার, ভাষা ডিজাইনারের জন্য রিজার্ভ রিডার ম্যাক্রো।
বুটলি

14

ডিএসএল অনুমোদনের জন্য রুবির সুবিধাগুলি ভাষার প্রকৃতি পরিবর্তন করে না। রুবির রূপক সুবিধাগুলি সহজাতভাবে রুবি সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের সাথে আবদ্ধ এবং আপনি যা কিছু লিখেন তা রুবির অবজেক্টের মডেল হিসাবে ফেলে দিতে হবে।

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

কার্যকরভাবে, একটি রুবি ডিএসএল এখনও রুবির মতো অনুভব করে তবে লিস্প ডিএসএলকে লিস্পের মতো মনে হয় না।


6
+1: ডিওএসএলের উদাহরণ হিসাবে লোপ খুব বেশি লিস্পি অনুভব করে না।
ফ্রাঙ্ক শায়ারার

2

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

class Foo < ActiveRecord::Base
    has_one :bar
    has_one :baz
end

তবে এই "ডিএসএল" এর ঘোষণামূলকতা (রুবির classবাক্য বাক্য গঠনের ঘোষণার মতো ) একটি ভয়াবহ মিথ্যা যা যে কেউ বুঝতে পারে যে রুবি "ডিএসএল" আসলে কীভাবে কাজ করে তা দ্বারা প্রকাশ করা যেতে পারে:

class Foo < ActiveRecord::Base
    [:bar,:baz,:qux,:quux].each do |table|
        has_one table if i_feel_like_it?(table)
    end
    puts "Just for shits and giggles, and to show"
    puts "just how fucked up Ruby really is, we're gonna ask you"
    puts "which SQL table you want the Foo model to have an"
    puts "association with.\n"
    puts "Type the name of a table here: "
    has_one gets.chomp.to_sym
end

(কেবলমাত্র লিস্প ফর্মের মূল অংশের নিকটবর্তী কিছু করার চেষ্টা করুন defclass!)

যত তাড়াতাড়ি আপনি আপনার কোডবেস উপরে মত কোড আছে, প্রকল্প প্রতি ডেভেলপার সম্পূর্ণরূপে বুঝতে রুবি DSLs হয়েছে আসলে কাজ (শুধুমাত্র বিভ্রম তারা তৈরি করুন) আগে তারা কোড স্থাপন করতে পারে। উপলভ্য ডকুমেন্টেশন সম্পূর্ণরূপে অকেজো হবে, কারণ এগুলি কেবল মূর্তিযুক্ত ব্যবহারের নথি করে , যা ঘোষণামূলক মায়া সংরক্ষণ করে।

আরএসপেক উপরের থেকে আরও খারাপ, কারণ এতে উদ্ভট প্রান্ত-কেস রয়েছে যার ডিবাগ করার জন্য বিপরীত প্রকৌশল-প্রয়োজন। (আমি একটি পুরো দিন অতিবাহিত। আউট কেন আমার পরীক্ষার বিষয় এক এড়ানো হচ্ছে চিন্তা করার চেষ্টা এটা প্রমাণিত যে RSpec সব পরীক্ষার বিষয় প্রেক্ষিতে আছে executes পর কোন প্রসঙ্গকে পরীক্ষার বিষয়, যাতে যা তারা উৎস প্রদর্শিত নির্বিশেষে , কারণ contextপদ্ধতিটি আপনার ব্লকটিকে সাধারণভাবে যাওয়ার চেয়ে আলাদা ডেটা স্ট্রাকচারে রাখে)

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

(আমি জানি আপনি ইতিমধ্যে একটি উত্তর গ্রহণ করেছেন, তবে যারা এটি পড়েন তারা অন ​​লিস্পের সম্পূর্ণতা পড়তে চান না ))

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