PasteRack.org
Paste # 92495
2017-05-23 17:24:02

Fork as a new paste.

Paste viewed 159 times.


Embed:

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