সংক্ষিপ্ত উত্তর দেওয়ার জন্য, ম্যাক্রোগুলি প্রচলিত লিস্প বা ডোমেন নির্দিষ্ট ভাষাগুলি (ডিএসএল) এর ভাষা সিনট্যাক্স এক্সটেনশনগুলি সংজ্ঞায়িত করতে ব্যবহৃত হয়। এই ভাষাগুলি বিদ্যমান লিস্প কোডের সাথে এমবেড করা আছে। এখন, ডিএসএলগুলিতে লিস্পের অনুরূপ সিনট্যাক্স থাকতে পারে (পিটার নরভিগের প্রজনন ইন্টারপ্রেটার ফর কমন লিস্পের মতো) বা সম্পূর্ণ আলাদা (যেমন ইনফিক্স নোটেশন ম্যাথ ক্লোজারের জন্য)।
এখানে আরও দৃ concrete় উদাহরণ:
পাইথনের ভাষায় অন্তর্নিহিত তালিকা বোঝার রয়েছে। এটি একটি সাধারণ ক্ষেত্রে সহজ সরল বাক্য গঠন দেয়। লাইন
divisibleByTwo = [x for x in range(10) if x % 2 == 0]
0 এবং 9 এর মধ্যে সমস্ত সমান সংখ্যার সমন্বিত একটি তালিকা উত্পন্ন করে পাইথন 1.5 দিনের মধ্যে এই জাতীয় সিনট্যাক্স ছিল না; আপনি এই জাতীয় কিছু ব্যবহার করতে চান:
divisibleByTwo = []
for x in range( 10 ):
if x % 2 == 0:
divisibleByTwo.append( x )
এগুলি উভয়ই কার্যত সমতুল্য। আসুন আমাদের অবিশ্বাসের স্থগিতাদেশ প্রার্থনা করি এবং ভান করি লিস্পের একটি খুব সীমাবদ্ধ লুপ ম্যাক্রো রয়েছে যা কেবল পুনরাবৃত্তি করে এবং তালিকা বোধগমের সমতুল্য করার সহজ উপায় না way
লিস্পে আপনি নিম্নলিখিত লিখতে পারেন। আমার এই লক্ষণীয় উদাহরণটি পাইথন কোডটির সাথে মিল হিসাবে ধরা হয়েছে, এটি লিস্প কোডের একটি ভাল উদাহরণ নয়।
;; the following two functions just make equivalent of Python's range function
;; you can safely ignore them unless you are running this code
(defun range-helper (x)
(if (= x 0)
(list x)
(cons x (range-helper (- x 1)))))
(defun range (x)
(reverse (range-helper (- x 1))))
;; equivalent to the python example:
;; define a variable
(defvar divisibleByTwo nil)
;; loop from 0 upto and including 9
(loop for x in (range 10)
;; test for divisibility by two
if (= (mod x 2) 0)
;; append to the list
do (setq divisibleByTwo (append divisibleByTwo (list x))))
আমি আরও যাওয়ার আগে, আমার ম্যাক্রো কী তা আরও ভাল করে ব্যাখ্যা করা উচিত। এটি কোড দ্বারা কোডে সম্পাদিত একটি রূপান্তর । এটি, দোভাষী (বা সংকলক) দ্বারা পড়া কোডের একটি অংশ, যা কোডটিকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করে, পরিচালনা করে এবং ফলাফলটি ফেরত দেয়, যা পরে স্থানে চালিত হয়।
অবশ্যই এটি প্রচুর টাইপিং এবং প্রোগ্রামাররা অলস। সুতরাং আমরা তালিকা বোঝার জন্য ডিএসএল সংজ্ঞায়িত করতে পারি। আসলে, আমরা ইতিমধ্যে একটি ম্যাক্রো ব্যবহার করছি (লুপ ম্যাক্রো)।
লিস্প কয়েকটি বিশেষ সিনট্যাক্স ফর্ম সংজ্ঞায়িত করে। উদ্ধৃতি ( '
) নির্দেশ করে যে পরবর্তী টোকেনটি আক্ষরিক। কোয়াশিকোট বা ব্যাকটিক ( `
) নির্দেশ করে যে পরবর্তী টোকেনটি আটকানো সহ আক্ষরিক। পালানো কমা অপারেটর দ্বারা নির্দেশিত হয়। আক্ষরিক '(1 2 3)
পাইথনের সমতুল্য [1, 2, 3]
। আপনি এটিকে অন্য পরিবর্তনশীলকে বরাদ্দ করতে পারেন বা এটি জায়গায় ব্যবহার করতে পারেন। আপনি `(1 2 ,x)
পাইথনের সমতুল্য হিসাবে ভাবতে পারেন [1, 2, x]
যেখানে x
পূর্বে সংজ্ঞাযুক্ত একটি পরিবর্তনশীল। এই তালিকা স্বরলিপিটি ম্যাক্রোতে চলে যাওয়া যাদুটির অংশ। দ্বিতীয় অংশটি লিস্প রিডার যা বুদ্ধিমানের সাথে কোডের জন্য ম্যাক্রোগুলিকে প্রতিস্থাপন করে তবে নীচে এটি সর্বোত্তম চিত্রিত:
সুতরাং আমরা একটি ম্যাক্রো সংজ্ঞায়িত করতে পারি lcomp
(তালিকা বোঝার জন্য সংক্ষিপ্ত)। এটি সিনট্যাক্স হ'ল পাইথনের মতো হবে যা আমরা উদাহরণে ব্যবহার করেছি [x for x in range(10) if x % 2 == 0]
-(lcomp x for x in (range 10) if (= (% x 2) 0))
(defmacro lcomp (expression for var in list conditional conditional-test)
;; create a unique variable name for the result
(let ((result (gensym)))
;; the arguments are really code so we can substitute them
;; store nil in the unique variable name generated above
`(let ((,result nil))
;; var is a variable name
;; list is the list literal we are suppose to iterate over
(loop for ,var in ,list
;; conditional is if or unless
;; conditional-test is (= (mod x 2) 0) in our examples
,conditional ,conditional-test
;; and this is the action from the earlier lisp example
;; result = result + [x] in python
do (setq ,result (append ,result (list ,expression))))
;; return the result
,result)))
এখন আমরা কমান্ড লাইনে কার্যকর করতে পারি:
CL-USER> (lcomp x for x in (range 10) if (= (mod x 2) 0))
(0 2 4 6 8)
বেশ সুন্দর, হাহ? এখন সেখানে থেমে নেই। আপনার যদি পছন্দ হয় তবে আপনার একটি মেকানিজম, বা একটি পেইন্ট ব্রাশ রয়েছে। আপনার যে কোনও সিনট্যাক্স আপনি সম্ভবত চাইলে রাখতে পারেন। পাইথন বা সি # এর with
সিনট্যাক্সের মতো। বা। নেট এর লিনকিউ সিনট্যাক্স। শেষ পর্যন্ত, এটিই লোককে লিস্প - চূড়ান্ত নমনীয়তার প্রতি আকর্ষণ করে।