PasteRack.org
Paste # 72911
2017-05-23 17:23:35

Fork as a new paste.

Paste viewed 102 times.


Embed:

  1. #lang racket
  2.  
  3. (require (for-syntax racket/syntax
  4.                      syntax/transformer)
  5.          syntax/parse/define)
  6.  
  7. (begin-for-syntax
  8.   (define (exp stx) (local-expand stx 'expression '()))
  9.  
  10.   (define current-id (make-parameter #f))
  11.  
  12.   (define walk+expand
  13.     (syntax-parser
  14.       #:literals [#%plain-app @%bind-id @%use-id]
  15.       #:context 'walk+expand
  16.       [(#%plain-app @%bind-id ~! e:expr)
  17.        #'(let-syntax
  18.              ([result-transformer
  19.                (let ([id-to-bind (generate-temporary 'the-binding)])
  20.                  (make-variable-like-transformer
  21.                   (parameterize ([current-id id-to-bind])
  22.                     (exp (walk+expand (exp #`(λ (#,id-to-bind) e)))))))])
  23.            result-transformer)]
  24.       [(@%plain-app @%use-id ~!)
  25.        #'(let-syntax
  26.              ([result-transformer
  27.                (make-variable-like-transformer
  28.                 (current-id))])
  29.            result-transformer)]
  30.       [(a . b) (datum->syntax this-syntax
  31.                               (cons (walk+expand #'a) (walk+expand #'b))
  32.                               this-syntax
  33.                               this-syntax)]
  34.       [_ this-syntax])))
  35.  
  36. (define-syntax-parser do-walk+expand
  37.   [(_ e:expr)
  38.    (walk+expand (exp #'e))])
  39.  
  40. (define (@%bind-id . args) (error '@%bind-id "should never persist until runtime"))
  41. (define (@%use-id . args) (error '@%use-id "should never persist until runtime"))
  42.  
  43. (do-walk+expand
  44.  (@%bind-id (+ 1 (@%use-id))))

=>

program::-1: syntax-parser: literal is unbound in phase 0

(phase 0 relative to the enclosing module)

  at: %bind-id

  in: (syntax-parser #:literals (#%plain-app %bind-id

%use-id) #:context (quote walk+expand) ((#%plain-app

%bind-id ~! e:expr) (syntax (let-syntax ((result-transformer

(let ((id-to-bind (generate-temporary (quote the-binding))))

(make-variable-like-transforme...