একটি সাজসজ্জা মূলত কেবল একটি ফাংশন ।
কমন লিস্পে উদাহরণ:
(defun attributes (keywords function)
(loop for (key value) in keywords
do (setf (get function key) value))
function)
উপরে ফাংশনটি একটি প্রতীক (যা দ্বারা প্রত্যাবর্তিত হবে DEFUN
) হয় এবং আমরা চিহ্নগুলির সম্পত্তি তালিকায় বৈশিষ্ট্যগুলি রেখেছি ।
এখন আমরা এটি একটি ফাংশন সংজ্ঞা চারপাশে লিখতে পারি:
(attributes
'((version-added "2.2")
(author "Rainer Joswig"))
(defun foo (a b)
(+ a b))
)
যদি আমরা পাইথনের মতো অভিনব বাক্য গঠন যুক্ত করতে চাই তবে আমরা একটি পাঠক ম্যাক্রো লিখি । একটি পাঠক ম্যাক্রো আমাদের এস-এক্সপ্রেশন সিনট্যাক্সের স্তরে প্রোগ্রাম করার অনুমতি দেয়:
(set-macro-character
#\@
(lambda (stream char)
(let ((decorator (read stream))
(arg (read stream))
(form (read stream)))
`(,decorator ,arg ,form))))
আমরা তখন লিখতে পারি:
@attributes'((version-added "2.2")
(author "Rainer Joswig"))
(defun foo (a b)
(+ a b))
লিস্প পাঠক উপরে পড়েন:
(ATTRIBUTES (QUOTE ((VERSION-ADDED "2.2")
(AUTHOR "Rainer Joswig")))
(DEFUN FOO (A B) (+ A B)))
এখন আমাদের কমন লিস্পে সাজসজ্জার একটি ফর্ম রয়েছে ।
ম্যাক্রো এবং রিডার ম্যাক্রোগুলির সংমিশ্রণ।
প্রকৃতপক্ষে আমি কোনও ফাংশন নয়, ম্যাক্রো ব্যবহার করে বাস্তব কোডে উপরের অনুবাদটি করব।
(defmacro defdecorator (decorator arg form)
`(progn
,form
(,decorator ,arg ',(second form))))
(set-macro-character
#\@
(lambda (stream char)
(declare (ignore char))
(let* ((decorator (read stream))
(arg (read stream))
(form (read stream)))
`(defdecorator ,decorator ,arg ,form))))
একই পাঠক ম্যাক্রোর সাথে উপরে ব্যবহার রয়েছে। সুবিধাটি হ'ল লিসপ সংকলক এখনও এটি তথাকথিত শীর্ষ-স্তরের ফর্ম হিসাবে দেখছে - * ফাইল সংকলক শীর্ষ স্তরের ফর্মগুলি বিশেষভাবে বিবেচনা করে, উদাহরণস্বরূপ এটি সংকলন-সময় পরিবেশে তাদের সম্পর্কে তথ্য যুক্ত করে । উপরের উদাহরণে আমরা দেখতে পাচ্ছি যে ম্যাক্রো উত্স কোডটি দেখে এবং নামটি বের করে।
লিস্প পাঠক উপরের উদাহরণটি এতে পড়েন:
(DEFDECORATOR ATTRIBUTES
(QUOTE ((VERSION-ADDED "2.2")
(AUTHOR "Rainer Joswig")))
(DEFUN FOO (A B) (+ A B)))
যা এর পরে ম্যাক্রোতে প্রসারিত হয়:
(PROGN (DEFUN FOO (A B) (+ A B))
(ATTRIBUTES (QUOTE ((VERSION-ADDED "2.2")
(AUTHOR "Rainer Joswig")))
(QUOTE FOO)))
ম্যাক্রোস রিডার ম্যাক্রোর থেকে খুব আলাদা ।
ম্যাক্রোগুলি উত্স কোডটি পাস হয়, তারা যা চায় তা করতে পারে এবং তারপরে উত্স কোডটি ফিরিয়ে দেয়। ইনপুট উত্সটি বৈধ লিস্প কোড হওয়ার দরকার নেই। এটি যে কোনও কিছু হতে পারে এবং এটি সম্পূর্ণ আলাদা লেখা যেতে পারে। ফলাফলটি তখন বৈধ লিস্প কোড হতে হবে। তবে উত্পন্ন কোডটি যদি ম্যাক্রোও ব্যবহার করে তবে ম্যাক্রো কলটিতে এমবেড করা কোডটির বাক্য গঠনটি আবার আলাদা সিনট্যাক্স হতে পারে। একটি সাধারণ উদাহরণ: কেউ একটি গণিত ম্যাক্রো লিখতে পারতেন যা কোনও ধরণের গাণিতিক বাক্য গঠন গ্রহণ করবে:
(math y = 3 x ^ 2 - 4 x + 3)
অভিব্যক্তিটি y = 3 x ^ 2 - 4 x + 3
বৈধ লিস্প কোড নয়, তবে ম্যাক্রো উদাহরণস্বরূপ এটি বিশ্লেষণ করতে এবং বৈধ লিস্প কোডটি এর মতো ফিরে আসতে পারে:
(setq y (+ (* 3 (expt x 2))
(- (* 4 x))
3))
লিস্পে ম্যাক্রোর আরও অনেকগুলি ব্যবহারের ঘটনা রয়েছে।