Guile மேக்ரோக்களைப் படிப்படியாக விரிவாக்கல்

Guile மேக்ரோக்களைப் படிப்படியாக விரிவாக்கல்

Published by Arun Isaac on

In other languages: English

Tags: lisp, scheme, மென்பொருள்

Guile மேக்ரோக்களை வழுநீக்கும்போது ஒவ்வொருப் படியாகத் தான் விரிவாக்க வேண்டும். அதற்கொருச் சிறு உதவி நிரல் இதோ.

Guile யின் macroexpand எப்போதுமோ எனக்குக் குழப்பத்தைத் தந்ததொன்று. அதுப் பல நேரம் மூலமான அடிநிலை மேக்ரோக்கள் வரை விரிவாக்குகிறது. நான் எழுதிய மேக்ரோவை வழுநீக்கும்போது இதுத் தேவையற்ற விவரம். ஒருப் படி விரிவாக்கத்தை மட்டுமே காண விரும்புகிறேன். அதற்குத் தான் me1 (macroexpand-1 என்பதன் சுருக்கம்) எழுதினேன். கீழ்க் காண்போம்.

(define (me1 x)
  (syntax->datum
   (syntax-case x ()
     ((head _ ...)
      (and=> (module-variable (current-module)
                              (syntax->datum #'head))
             (compose macro? variable-ref))
      ((macro-transformer (module-ref (current-module)
                                      (syntax->datum #'head)))
       x))
     (_ x))))

Guile கையேட்டிலிருந்து ஒரு or மேக்ரோ இதோ.

(define-syntax my-or
  (syntax-rules ()
    ((my-or)
     #f)
    ((my-or exp)
     exp)
    ((my-or exp rest ...)
     (let ((t exp))
       (if t
           t
           (my-or rest ...))))))

அதை me1 கொண்டு விரிவாக்குவோம்:

(me1 #'(my-or 1 2 3))

அது இதைக் கொடுக்கிறது:

(let ((t 1)) (if t t (my-or 2 3)))

me1 #' கொண்டு குறிக்கப்பட்ட syntax யை ஏற்கிறது, மேற்கோளிட்ட கோவையை (quoted form) அல்ல என்பதைக் காண்க. மேலும், me1 தற்போதைய நிரல்கூற்றிலுள்ள மேக்ரோக்கள் மீது மட்டுமே செயலாற்றுகிறதென்பதையும் மனதில் கொள்க.