macros - हरण - क्या लिस्प मैक्रो को परिभाषित करते समय दोहरे उद्धरण चिह्न(डबल कॉमा) का उपयोग होता है?



विवरण चिन्ह के उदाहरण (1)

जब कोई मैक्रो को परिभाषित करता है जो एक मैक्रोलेट का उपयोग करता है, या एक मैक्रो को परिभाषित करता है जो एक मैक्रो को परिभाषित करता है, तो ऐसा लगता है कि कोई चीज़ उपयोग नहीं करता है, या, चीजों को उजागर करने के लिए। क्या कभी ऐसा मामला है जब मुझे उपयोग करने की आवश्यकता है?


ज़रूर।

यहां ग्राहम के "ऑन लिस्प" से कोड है:

(defmacro =defun (name parms &body body)
  (let ((f (intern (concatenate 'string
                                "=" (symbol-name name)))))
    `(progn
       (defmacro ,name ,parms
         `(,',f *cont* ,,@parms))
       (defun ,f (*cont* ,@parms) ,@body))))

एक अन्य उदाहरण clx/gcontext.lisp :

(macrolet ((def-gc-internals (name &rest extras)
             (let ((macros nil)
                   (indexes nil)
                   (masks nil)
                   (index 0))
               (dolist (name *gcontext-components*)
                 (push `(defmacro ,(xintern 'gcontext-internal- name) (state)
                          `(svref ,state ,,index))
                       macros)
                 (setf (getf indexes name) index)
                 (push (ash 1 index) masks)
                 (incf index))
               (dolist (extra extras)
                 (push `(defmacro ,(xintern 'gcontext-internal- (first extra)) (state)
                          `(svref ,state ,,index))
                       macros)
                 ;; don't override already correct index entries
                 (unless (or (getf indexes (second extra)) (getf indexes (first extra)))
                   (setf (getf indexes (or (second extra) (first extra))) index))
                 (push (logior (ash 1 index)
                               (if (second extra)
                                   (ash 1 (position (second extra) *gcontext-components*))
                                   0))
                       masks)
                 (incf index))
               `(within-definition (def-gc-internals ,name)
                  ,@(nreverse macros)
                  (eval-when (:execute :compile-toplevel :load-toplevel)
                    (defparameter *gcontext-data-length* ,index)
                    (defparameter *gcontext-indexes* ',indexes)
                    (defparameter *gcontext-masks*
                      ',(coerce (nreverse masks) 'simple-vector)))))))
  (def-gc-internals ignore
    (:clip :clip-mask) (:dash :dashes) (:font-obj :font) (:timestamp)))

संक्षेप में, यह बहुत आम नहीं है, लेकिन अनसुना के नहीं।