আমি এখানে একটি ডিবাগিংয়ের জন্য ব্যবহার করি (ক্লোজারে):
user=> (defmacro print-var [varname] `(println ~(name varname) "=" ~varname))
#'user/print-var
=> (def x (reduce * [1 2 3 4 5]))
#'user/x
=> (print-var x)
x = 120
nil
আমাকে সি ++ এ হ্যান্ড-রোলড হ্যাশ-টেবিলের সাথে মোকাবিলা করতে হয়েছিল, যেখানে get
পদ্ধতিটি একটি যুক্তি হিসাবে একটি অ-কনস্ট্রিং স্ট্রিং রেফারেন্স নিয়েছিল, যার অর্থ আমি এটি আক্ষরিক দিয়ে বলতে পারি না। মোকাবেলা করা সেই সহজ করার জন্য আমি নীচের মতো কিছু লিখেছিলাম:
#define LET(name, value, body) \
do { \
string name(value); \
body; \
assert(name == value); \
} while (false)
যদিও এই সমস্যার মতো কিছু লিস্পে আসার সম্ভাবনা নেই, তবে আমি এটি বিশেষভাবে দেখতে পেয়েছি যে আপনি ম্যাক্রোগুলি থাকতে পারেন যা তাদের যুক্তিগুলিকে দুবার মূল্যায়ন করে না, উদাহরণস্বরূপ সত্যিকারের লেট-বাইন্ডিং প্রবর্তন করে । (স্বীকার, এখানে আমি এটি প্রায় অর্জন করতে পারে)।
আমি do ... while (false)
এমনভাবে মোড়ানো জিনিসগুলির ভয়াবহ কুৎসিত হ্যাকেরও অবলম্বন করি যাতে আপনি এটি যদি কোনও অংশের মধ্যে ব্যবহার করতে পারেন এবং এখনও অন্য অংশের প্রত্যাশা মতো কাজ করতে পারেন। আপনার লিস্পে এটির দরকার নেই, এটি স্ট্রিং (বা টোকেন ক্রমগুলি সি, সি এবং সি ++ এর ক্ষেত্রে) এর চেয়ে সিনট্যাক্স গাছগুলিতে পরিচালিত ম্যাক্রোগুলির একটি ক্রিয়া যা পার্সিংয়ের মধ্য দিয়ে চলেছে।
কয়েকটি বিল্ট-ইন থ্রেডিং ম্যাক্রোগুলি রয়েছে যা আপনার কোডটি পুনরায় সাজানোর জন্য ব্যবহার করা যেতে পারে যাতে এটি আরও পরিষ্কার করে পড়ে ('থ্রেডিং' যেমন 'আপনার কোড একসাথে বপন করা' সমান্তরালতা নয়)। উদাহরণ স্বরূপ:
(->> (range 6) (filter even?) (map inc) (reduce *))
এটি প্রথম রূপ নেয় (range 6)
, এবং এটি পরবর্তী ফর্মের (filter even?)
শেষ যুক্তি হিসাবে তৈরি করে, যা পরবর্তী ফর্মের শেষ যুক্তি হিসাবে তৈরি করা হয় এবং এর ফলে উপরেরটি আবার লিখিত হয়
(reduce * (map inc (filter even? (range 6))))
আমি মনে করি প্রথমটি আরও স্পষ্টভাবে পড়েছে: "এই ডেটাগুলি নিয়ে নিন, এটি এটি করুন, তারপরে এটি করুন, তারপরে অন্যটি করুন এবং আমরা সম্পন্ন করেছি", তবে এটি বিষয়গত; বস্তুগতভাবে সত্য এমন কিছু হ'ল আপনি যে ক্রমগুলি সম্পাদন করছেন সেগুলি ক্রিয়াকলাপগুলি পড়েন (অলসতা উপেক্ষা করে)।
এখানে একটি বৈকল্পিকও রয়েছে যা পূর্বের রূপটিকে প্রথম (শেষের চেয়ে বরং) যুক্তি হিসাবে সন্নিবেশ করায়। একটি ব্যবহারের ক্ষেত্রে পাটিগণিত:
(-> 17 (- 2) (/ 3))
"17 নিন, 2 কে বিয়োগ করুন এবং 3 দ্বারা ভাগ করুন" হিসাবে পড়ে।
পাটিগণিতের কথা বললে, আপনি এমন ম্যাক্রো লিখতে পারেন যা ইনফিক্স নোটেশন পার্সিং করে, যাতে আপনি উদাহরণস্বরূপ বলতে পারেন (infix (17 - 2) / 3)
এবং এটি থুতুতে পারে (/ (- 17 2) 3)
যা কম পঠনযোগ্য হওয়ার অসুবিধা এবং বৈধ লিস্প এক্সপ্রেশন হওয়ার সুবিধা রয়েছে। এটি ডিএসএল / ডেটা সাবল্যাংয়েজি অংশ।