ফাইলটি সংকলন করার সময় ম্যাক্রোগুলি কি প্রসারিত হবে?


13

আমার কাছে একটি ম্যাক্রো রয়েছে যা ব্যবহারের সংকলন-ব্যবহারের প্রতিটি ক্ষেত্রেই প্রসারিত করা দরকার। কোডবেস না করে এবং প্রতিটি কলকে সতর্কতার সাথে মোড়ানো ছাড়া আমি কী এটি নির্দিষ্ট করতে পারি eval-when-compile?

উত্তর:


13

বাইট-সংকলক দ্বারা অ্যাক্সেসযোগ্য সমস্ত ম্যাক্রোগুলি সংকলনের সময় প্রসারিত হয়। "পৌঁছনীয়" এর অর্থ মূলত উদ্ধৃত না হওয়া।

defunS, defmacros, lambdas এর বডি সমস্ত বাইট-সংকলন করা হয় যখন তাদের উত্স ফাইলটিতে বাইট-সংকলন করা হয়। সুতরাং হ্যাঁ, তাদের অভ্যন্তরের যে কোনও ম্যাক্রো প্রসারিত হবে, যতক্ষণ না তারা কোনও উদ্ধৃতি ( ') এর ভিতরে না থাকে । খুব সাধারণ ভুল মোড়ানো হয় lambdaযে কেন আপনি উচিত আসলে একটি উদ্ধৃতি s এবং, আপনার উদ্ধৃত কখনো lambdaগুলি

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


7

মালাবারবা যেমন ইতিমধ্যে ব্যাখ্যা করেছেন, বাইট সংকলনের সময় ম্যাক্রোগুলি প্রসারিত হয়। যদি কোনও ফাইল সংকলন না করা হয়, ফাইলটি লোড করা হলে ম্যাক্রোগুলি প্রসারিত হয় (আগ্রহী ম্যাক্রো সম্প্রসারণ)।

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

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

ফলস্বরূপ আপনি আপনার ম্যাক্রোর বিপরীতে সংকলিত কোনও কোড না ভেঙে এই এপিআই, বা ম্যাক্রো সম্প্রসারণের উপর নির্ভর করে এমন কোনও কিছুই পরিবর্তন করতে পারবেন না।

কার্যকারিতার জন্য ম্যাক্রোর উদার ব্যবহার নির্ভরতা নরকের পথে প্রসারিত করে


ম্যাক্রোগুলি লিখতে বা ব্যবহার করার সময় খুব ভাল পয়েন্ট মনে রাখা উচিত।
শান অলরেড 21

"কার্যকারিতার জন্য ম্যাক্রোর উদার ব্যবহার নির্ভরতা জাহান্নামের রাস্তা তৈরি করে।" এক সপ্তাহ আগে অবধি প্যাকেজ.এলে একটি বাগ ছিল যা পুরোপুরি বৈধ ম্যাক্রো নির্ভরতার পরিস্থিতিতে প্যাকেজ ইনস্টলেশন সম্পূর্ণরূপে ভেঙে দিয়েছিল।
মালবারবা

@ মালবারবা বিশদ বিবরণ দেওয়ার জন্য যত্ন?
লুনারিওর

@lunaryorn এখানে আপনি যেতে । ছোট ছোট সমস্যা।
মালবারবা

1
@ লুনারিয়রন আমি সম্মতি দিচ্ছি যে ম্যাক্রোগুলি বিপজ্জনক (এমনকি আমি আমার উত্তর কম প্রশংসিত শোনার জন্য সম্পাদনা করব :), তবে আমি মনে করি না যে বাগ এটির একটি নির্দিষ্ট উদাহরণ ছিল। এই বাগের মধ্যে অন্যান্য (কম উত্তেজনাপূর্ণ) প্রকাশ ছিল যা ম্যাক্রোগুলিকে মোটেই জড়িত না। এটি ফাংশন নির্ভরতাগুলির সাথে সমস্যাও তৈরি করেছিল।
মালবারবা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.