কখন ম্যাক্রো ব্যবহার করবেন বা ব্যবহার করবেন না [বন্ধ]


12

আমি কখন আমার প্রোগ্রামে ম্যাক্রো ব্যবহার করব বা করব না?

এই প্রশ্নটি @ পার্সিয়াসের একটি তথ্যমূলক উত্তরে অনুপ্রাণিত হয়েছে । আমি বিশ্বাস করি অনেকেরই অন্যকে ভাগ করে নেওয়ার দুর্দান্ত অভিজ্ঞতা রয়েছে। আমি আশা করি এই প্রশ্নটি দুর্দান্ত সাবজেক্টিভ প্রশ্নগুলির একটি হয়ে উঠবে এবং ইমাক্স প্রোগ্রামারদের সহায়তা করবে।

উত্তর:


13

চলতি নিয়ম

সিনট্যাক্সের জন্য ম্যাক্রোগুলি ব্যবহার করুন তবে শব্দার্থবিদ্যার জন্য কখনও নয় ।

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

কেন?

ম্যাক্রোগুলির একটি ভয়ঙ্কর প্রচুর ঘাটতি রয়েছে:

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

1
লেক্সিকাল বাইন্ডিং বনাম ম্যাক্রো প্রসারণ সম্পর্কিত নোটগুলি বিশেষ আকর্ষণীয়; ধন্যবাদ লুনারিওর্ন (আমি যে কোনও কোড লিখেছি তার জন্য আমি কখনই লেসিক্যাল-বাইন্ডিং সক্ষম করে দেখিনি, তাই এটি কোনও দ্বন্দ্ব নয় যা আমি কখনও ভেবে
দেখিনি

6

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

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

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

অন্যভাবে এটির উচ্চারণ করতে, ম্যাক্রোগুলি ভাষার অঙ্গ হয়ে যায়। আপনি যদি অজানা ম্যাক্রোগুলি সহ একটি কোড পড়ছেন তবে আপনি প্রায় এমন একটি ভাষাতে একটি কোড পড়ছেন যা আপনি জানেন না।

উপরের রিজার্ভেশন ব্যতিক্রম:

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

এছাড়াও, আমি ম্যাক্রোগুলিকে পছন্দ করি না save-selected-window: তারা স্টোর সঞ্চয় করে এবং পুনরুদ্ধার করে এবং তাদের আরগগুলি একইভাবে মূল্যায়ন prognকরে। খুব সোজা, আসলে কোডকে সহজ করে তোলে।

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

একটি খারাপ ম্যাক্রো একটি উদাহরণ, আমার মতে, হয় magit-section-actionএবং magit-section-caseMagit হবে। প্রথমটি ইতিমধ্যে সরানো হয়েছে, তবে দ্বিতীয়টি এখনও রয়ে গেছে।


4

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

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

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

  1. defun এবং বন্ধুরা, যা ভাষার অপরিহার্য অঙ্গ, একই পদে আপনি ফাংশন কলগুলি বর্ণনা করতে পারবেন না।

  2. setfনিয়মগুলি কীভাবে কার্য সম্পাদন করে তার বিবরণের মতো প্রতিক্রিয়ার বিবরণ অপর্যাপ্ত বলে বর্ণনা করে (setf (aref x y) z)

  3. with-output-to-stringম্যাক্রোর অভ্যন্তরে কোডটির শব্দার্থবিজ্ঞানও পরিবর্তন করে। একইভাবে, with-current-bufferএবং অন্যান্য with-ম্যাক্রোগুলির একগুচ্ছ ।

  4. dotimes এবং অনুরূপ ফাংশনের ক্ষেত্রে বর্ণনা করা যায় না।

  5. ignore-errors কোডটির শব্দার্থক শব্দটিকে এটি মোড়ানো করে changes

  6. cl-libপ্যাকেজ, eieioপ্যাকেজ এবং ইমাস লিস্পে ব্যবহৃত কয়েকটি প্রায় সর্বব্যাপী গ্রন্থাগারগুলিতে ম্যাক্রোগুলির পুরো গোছা রয়েছে যা ফাংশন ফর্মগুলির মতো বিভিন্ন ব্যাখ্যা হতে পারে বলে মনে হয়।

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


যখন আমি ম্যাক্রোগুলি ব্যবহার করব না:

  1. যখন তারা নতুন শব্দার্থবিজ্ঞানের সাথে কোনও নতুন নির্মাণকে উপস্থাপন করবেন না (অর্থাত ফাংশনটি ঠিক তেমন কাজ করবে)।

  2. যখন এটি কেবল এক ধরণের সুবিধা (যেমন ম্যাক্রো নামের একটি ম্যাক্রো তৈরি mvbকরা যা cl-multiple-value-bindএটি আরও সংক্ষিপ্ত করতে প্রসারিত )।

  3. যখন আমি প্রত্যাশা করি যে অনেক ত্রুটি পরিচালনার কোডটি ম্যাক্রো দ্বারা লুকানো থাকবে (যেমনটি উল্লেখ করা হয়েছে, ম্যাক্রোগুলি ডিবাগ করা কঠিন)।


যখন আমি কার্যের চেয়ে ম্যাক্রোগুলিকে দৃ strongly়তার সাথে পছন্দ করব:

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

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


চিত্রণ

নীচে জলযুক্ত সংস্করণটি কম্পিউটার বিজ্ঞানে শব্দার্থক বলতে কী বোঝায় সে সম্পর্কে একটি অন্তর্দৃষ্টি দেওয়ার উদ্দেশ্যে তৈরি করা হয়েছে।

ধরুন আপনার কাছে কেবল এই বাক্য গঠন নিয়মগুলি সহ একটি অত্যন্ত সাধারণ প্রোগ্রামিং ভাষা রয়েছে:

variable := 1 | 0
operation := +
expression := variable | (expression operation expression)

এই ভাষা দিয়ে আমরা মত "প্রোগ্রাম" গঠন করা যেতে পারে (1+0)+1বা 0বা ((0+0))ইত্যাদি

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

ধরুন আমরা এখন আমাদের ভাষাকে (শব্দার্থক) বিধি দ্বারা সজ্জিত করেছি:

0+0  0+1  1+0  1+1  (exp)
---, ---, ---, ---, -----
 0   1+0   1    0    exp

এখন আমরা আসলে এই ভাষাটি ব্যবহার করে গণনা করতে পারি। অর্থাৎ, আমরা সিনট্যাক্টিকাল প্রতিনিধিত্ব নিতে পারি, এটি বিমূর্তভাবে বুঝতে পারি (অন্য কথায়, এটাকে অ্যাবস্ট্রাক্ট সিনট্যাক্সে রূপান্তরিত করে), তারপরে এই প্রতিনিধিত্বকে হেরফের করার জন্য শব্দার্থ বিধি ব্যবহার করতে পারি।

আমরা যখন ভাষার লিস্প পরিবার সম্পর্কে কথা বলি, ফাংশন মূল্যায়নের মূল শব্দটির নিয়মগুলি প্রায় ল্যাম্বডা-ক্যালকুলাসের:

(f x)  (lambda x y)   x
-----, ------------, ---
 fx        ^x.y       x

উদ্ধৃতি এবং ম্যাক্রো-এক্সপেনশন প্রক্রিয়াগুলি মেটা-প্রোগ্রামিং সরঞ্জাম হিসাবেও পরিচিত, যেমন তারা কেবল প্রোগ্রামিংয়ের পরিবর্তে কোনওটিকে প্রোগ্রাম সম্পর্কে কথা বলতে দেয় । তারা "মেটা স্তর" ব্যবহার করে নতুন শব্দার্থবিদ্যা তৈরি করে এটি অর্জন করেছে। এই জাতীয় সরল ম্যাক্রোর উদাহরণ হ'ল:

(a . b)
-------
(cons a b)

এটি আসলে ইমাস লিস্পে কোনও ম্যাক্রো নয়, তবে এটি হতে পারত। আমি কেবল সরলতার জন্য বেছে নিয়েছি। লক্ষ্য করুন যে উপরোক্ত সংজ্ঞাযুক্ত কোনও নিয়মই এই ক্ষেত্রে প্রযোজ্য নয় যেহেতু নিকটতম প্রার্থী একটি ফাংশন হিসাবে (f x)ব্যাখ্যা fকরেন, যদিও aঅগত্যা কোনও ফাংশন নয়।


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

1
আপনার দ্বিতীয় মন্তব্য: আপনি দয়া করে আপনি যে ম্যাক্রো ব্যবহার করছেন তার সংজ্ঞাটি আমাকে উল্লেখ করতে পারেন যা আপনার দাবী বলে? আমি সবেমাত্র আপনাকে একটি উদাহরণ দিয়েছি যেখানে ম্যাক্রোর মাধ্যমে নতুন শব্দার্থবিধি চালু করা হয়েছে। কমপক্ষে সিএসের যথাযথ অর্থে। আমি মনে করি না যে সংজ্ঞাগুলি নিয়ে তর্ক করা উত্পাদনশীল এবং আমি আরও মনে করি যে সিএসে ব্যবহৃত সংজ্ঞাগুলি এই আলোচনার জন্য সেরা মিল।
wvxvw

1
ঠিক আছে ... আপনি "শব্দার্থবিজ্ঞান" শব্দের অর্থ সম্পর্কে কী আপনার নিজস্ব ধারণা পেয়েছেন, যা বিদ্রূপাত্মক, যদি আপনি এটির বিষয়ে চিন্তা করেন তবে :) তবে সত্যিকার অর্থে, এই বিষয়গুলির খুব সুনির্দিষ্ট সংজ্ঞা রয়েছে, আপনি ঠিক বলেছেন .. এগুলি উপেক্ষা করুন। উত্তরে আমি যে বইটি লিঙ্ক করেছি সেটি সিএস সম্পর্কিত কোর্সে শেখানো হিসাবে শব্দার্থবিজ্ঞানের উপর একটি স্ট্যান্ডার্ড পাঠ্যপুস্তিকা। আপনি যদি কেবল উইকের সাথে সম্পর্কিত নিবন্ধটি পড়ে থাকেন: en.wikedia.org/wiki/Semantics_%28 কম্পিউটার_সায়েন্স ১০৯৯ আপনি দেখতে পাবেন এটি আসলে কী সম্পর্কে। উদাহরণ হ'ল (defun x y)বনাম ফাংশন অ্যাপ্লিকেশনটির ব্যাখ্যা করার নিয়ম ।
wvxvw

ওহ ভাল, আমি মনে করি না যে এটি আমার আলোচনার উপায়। এটি চেষ্টা করেও শুরু করা ভুল ছিল; এসবের কোনও মানে নেই বলে আমি আমার মন্তব্যগুলি সরিয়েছি। আমি আপনার সময় নষ্ট করার জন্য দুঃখিত।
চন্দ্রালম্বি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.