PasteRack.org
Paste # 9376
2025-06-17 21:11:11

Fork as a new paste.

Paste viewed 838 times.


Embed:

Pretty printing fully expanded code

  1. #lang racket
  2.  
  3. (pretty-print-columns 100)
  4.  
  5. ; Notes:
  6. ;  Disabling `eval-jit-enabled` affects the expansion.
  7. ;  Unless disabled, `reverse` becomes `alt-reverse`.
  8. (define (topexpand top-level-form-stx)
  9.   (parameterize ([current-namespace (make-base-namespace)]
  10.                  [eval-jit-enabled  #f])
  11.     (namespace-require 'racket/private/struct)
  12.     (expand-syntax top-level-form-stx)))
  13.  
  14.  
  15. (require syntax/kerncase)
  16.  
  17. (define (prettify x)
  18.   (prettify-top-level-form x))
  19.  
  20. (define (prettify-top-level-form x)
  21.   ; (displayln 'prettify-top-level-form)
  22.   (kernel-syntax-case x #f
  23.     [(#%expression expr)
  24.      (with-syntax ([expr (prettify-top-level-form #'expr)])
  25.        #'(#%expression expr))]
  26.     [(module id module-path
  27.        (#%module-begin module-level-form ...))
  28.      (with-syntax ([(module-level-form ...)
  29.                     (map prettify-top-level-form
  30.                          (syntax->list #'(module-level-form ...)))])
  31.        #'(module id module-path
  32.            module-level-form ...))]
  33.     [(begin top-level-form ...)
  34.      (with-syntax ([(top-level-form ...)
  35.                     (map prettify-top-level-form
  36.                          (syntax->list #'(top-level-form ...)))])
  37.        #'(begin top-level-form ...))]
  38.     [(begin-for-syntax top-level-form ...)
  39.      (with-syntax ([(top-level-form ...)
  40.                     (map prettify-top-level-form
  41.                          (syntax->list #'(top-level-form ...)))])
  42.        #'(begin-for-syntax top-level-form ...))]
  43.     [_
  44.      (prettify-general-top-level-form x)]))
  45.  
  46. (define (prettify-module-level-form x)
  47.   ; (displayln 'prettify-module-level-form)
  48.   (kernel-syntax-case x #f
  49.      [(#%provide raw-provide-spec ...)
  50.       x]
  51.      [(begin-for-syntax module-level-form ...)
  52.       (with-syntax ([(module-level-form ...)
  53.                      (map prettify-top-level-form
  54.                           (syntax->list #'(module-level-form ...)))])
  55.         #'(begin-for-syntax module-level-form ...))]
  56.       [(module  . _) (prettify-submodule-form x)]
  57.       [(module* . _) (prettify-submodule-form x)]
  58.       [(#%declare declaration-keyword ...) x]
  59.       [_
  60.        (prettify-general-top-level-form x)]))
  61.  
  62. (define (prettify-submodule-form x)
  63.   ; (displayln 'prettify-submodule-form)
  64.   (kernel-syntax-case x #f
  65.     [(module id module-path
  66.        (#%plain-module-begin module-level-form ...))
  67.      (with-syntax ([(module-level-form ...)
  68.                     (map prettify-module-level-form
  69.                          (syntax->list #'(module-level-form ...)))])
  70.        #'(module id module-path
  71.            (#%plain-module-begin module-level-form ...)))]
  72.     [(module* id #f
  73.        (#%plain-module-begin module-level-form ...))
  74.      (with-syntax ([(module-level-form ...)
  75.                     (map prettify-module-level-form
  76.                          (syntax->list #'(module-level-form ...)))])
  77.        #'(module* id #f
  78.            (#%plain-module-begin module-level-form ...)))]
  79.     [(module* id module-path
  80.        (#%plain-module-begin module-level-form ...))
  81.      (with-syntax ([(module-level-form ...)
  82.                     (map prettify-module-level-form
  83.                          (syntax->list #'(module-level-form ...)))])
  84.        #'(module* id module-path
  85.            (#%plain-module-begin module-level-form ...)))]
  86.     [_ (error)]))
  87.  
  88. (define (prettify-general-top-level-form x)
  89.   ; (displayln 'prettify-general-top-level-form)
  90.   (kernel-syntax-case x #f
  91.     [(define-values (id) expr)
  92.      (with-syntax ([expr (prettify-expr #'expr)])
  93.        #'(define id expr))]
  94.     [(define-values (id ...) expr)
  95.      (with-syntax ([expr (prettify-expr #'expr)])
  96.        #'(define-values (id ...) expr))]
  97.  
  98.     [(define-syntaxes (id) expr)
  99.      (with-syntax ([expr (prettify-expr #'expr)])
  100.        #'(define-syntax id expr))]
  101.     [(define-syntaxes (id ...) expr)
  102.      (with-syntax ([expr (prettify-expr #'expr)])
  103.        #'(define-syntaxes (id ...) expr))]
  104.  
  105.     [(#%require raw-require-spec ...)
  106.      x]
  107.  
  108.     [_
  109.      (prettify-expr x)]))
  110.  
  111. (define (prettify-expr* xs)
  112.   (map prettify-expr
  113.        (syntax->list xs)))
  114.  
  115. (define (prettify-expr** xss)
  116.   (map prettify-expr*
  117.        (syntax->list xss)))
  118.  
  119. (define (prettify-expr x)
  120.   ; (displayln 'prettify-expr) (displayln x)
  121.   (kernel-syntax-case* x #f ()
  122.     [id (identifier? #'id) x]
  123.     [(#%plain-lambda formals expr ...)
  124.      (with-syntax ([(expr ...) (prettify-expr* #'(expr ...))])
  125.        #'(lambda formals expr ...))]
  126.     [(case-lambda (formals expr ...) ...)
  127.      (with-syntax ([((expr ...) ...) (prettify-expr** #'((expr ...) ...))])
  128.        #'(case-lambda (formals expr ...) ...))]
  129.     [(if expr0 expr1 expr2)
  130.      (with-syntax ([expr0 (prettify-expr #'expr0)]
  131.                    [expr1 (prettify-expr #'expr1)]
  132.                    [expr2 (prettify-expr #'expr2)])
  133.        #'(if expr0 expr1 expr2))]
  134.     [(begin expr ...)
  135.      (with-syntax ([(expr ...) (prettify-expr* #'(expr ...))])
  136.        #'(begin expr ...))]
  137.     [(begin0 expr0 expr ...)
  138.      (with-syntax ([(expr0 expr ...) (prettify-expr* #'(expr0 expr ...))])
  139.        #'(begin expr0 expr ...))]
  140.     [(let-values ([(id) expr] ...) bexpr ...)
  141.      (with-syntax ([(expr ...)  (prettify-expr* #'(expr ...))]
  142.                    [(bexpr ...) (prettify-expr* #'(bexpr ...))])
  143.        #'(let ([id expr] ...) bexpr ...))]
  144.     [(let-values ([(id ...) expr] ...) bexpr ...)
  145.      (with-syntax ([(expr ...) (prettify-expr* #'(expr ...))]
  146.                    [(bexpr ...) (prettify-expr* #'(bexpr ...))])
  147.        #'(let-values ([(id ...) expr] ...) bexpr ...))]
  148.     [(letrec-values ([(id) expr] ...) bexpr ...)
  149.      (with-syntax ([(expr ...) (prettify-expr* #'(expr ...))]
  150.                    [(bexpr ...) (prettify-expr* #'(bexpr ...))])
  151.        #'(letrec ([id expr] ...) bexpr ...))]
  152.     [(letrec-values ([(id ...) expr] ...) bexpr ...)
  153.      (with-syntax ([(expr ...) (prettify-expr* #'(expr ...))]
  154.                    [(bexpr ...) (prettify-expr* #'(bexpr ...))])
  155.        #'(letrec-values ([(id ...) expr] ...) bexpr ...))]
  156.     [(set! id expr)
  157.      (with-syntax ([expr (prettify-expr #'expr)])
  158.        #'(set! id expr))]
  159.     [(quote datum)                x]
  160.     [(quote-syntax datum)         x]
  161.     [(quote-syntax datum #:local) x]
  162.     [(with-continuation-mark expr0 expr1 expr2)
  163.      (with-syntax ([(expr ...) (prettify-expr* #'(expr0 expr1 expr2))])
  164.        #'(with-continuation-mark expr ...))]
  165.     [(#%plain-app expr ...)
  166.      (with-syntax ([(expr ...) (#%plain-app prettify-expr* #'(expr ...))])
  167.        #'(expr ...))]
  168.     [(#%top . id) x]
  169.     [(#%variable-reference id) x]
  170.     [(#%variable-reference (#%top . id)) x]
  171.     [(#%variable-reference) x]
  172.     [(#%datum . _) x]
  173.     [_ (error 'prettify "got x: ~a" x)]))
  174.  
  175.  
  176. (pretty-print
  177.  (syntax->datum
  178.   (prettify
  179.    (topexpand #'(module foo racket/base
  180.                   (struct foo (bar) #:transparent)
  181.                   (define-values (fact)
  182.                     (lambda (n)
  183.                       (if (zero? n)
  184.                           1
  185.                           (* n (fact (- n 1))))))
  186.                   (foo (fact 5)))))))
  187.  
  188.  
  189.  
  190. #;(pretty-print
  191.            (prettify
  192.            (syntax->datum
  193.             (topexpand #'(module foo racket/base
  194.                            (define-values (fact)
  195.                              (lambda (n)
  196.                                (if (zero? n)
  197.                                    1
  198.                                    (* n (fact (- n 1))))))
  199.                            (fact 5))))))
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206. #;(pretty-print
  207.  (syntax->datum
  208.   (prettify
  209.    (topexpand #'(module foo '#%kernel
  210.                   (define-values (fact)
  211.                     (lambda (n)
  212.                       (if (zero? n)
  213.                           1
  214.                           (* n (fact (- n 1))))))
  215.                   (fact 5))))))
  216.  

=>

'(module foo racket/base

   (module configure-runtime '#%kernel (#%require racket/runtime-config) (configure '#f))

   (define-values

    (struct:foo foo1 foo? foo-bar)

    (let-values (((struct: make- ? -ref -set!)

                  (let ()

                    (let () (make-struct-type 'foo '#f '1 '0 '#f null '#f '#f '(0) '#f 'foo)))))

      (values struct: make- ? (make-struct-field-accessor -ref '0 'bar))))

   (define-syntax foo

     (make-self-ctor-checked-struct-info

      (lambda ()

        (list

         (quote-syntax struct:foo)

         (quote-syntax foo)

         (quote-syntax foo?)

         (list (quote-syntax foo-bar))

         (list '#f)

         '#t))

      '(bar)

      (list (list) (list))

      (lambda () (quote-syntax foo1))))

   (define fact (lambda (n) (if (zero? n) '1 (* n (fact (- n '1))))))

   (call-with-values (lambda () (foo1 (fact '5))) print-values))