PasteRack.org
Paste # 99121
2018-04-16 18:05:01

Forked from paste # 85722.

Fork as a new paste.

Paste viewed 734 times.


Embed:

mailing list question

#lang racket
(require (for-syntax syntax/parse racket/list syntax/transformer))

(begin-for-syntax
  (struct communicate (transformer value)
    #:property prop:procedure (struct-field-index transformer))

(define-syntax (access stx)
  (syntax-parse stx
    [(_ x:id)
     #:fail-unless (communicate? (syntax-local-value #'x))
     (format "Expected ~a to be bound by my-let" (syntax-e #'x))
     #'(cons x '#,(communicate-value (syntax-local-value #'x)))]))
     
(define-syntax (my-let stx)
  (syntax-parse stx
    [(_ ([x:id e:expr] ...) body:expr)
     #'(let-syntax ([x (communicate
                         (make-variable-like-transformer #'e)
	                   (length (flatten (syntax->datum #'e))))] ...)
	   body))]))
(my-let ([x '(a . (b . (((c . d) . 4) . 5)))])
  (access x))

=>

prog:21:16: read: missing `]' to close `[' on line 17, found instead `)'
  context...:
   /home/pasterack/racket68/collects/syntax/module-reader.rkt:186:17: body
   /home/pasterack/racket68/collects/syntax/module-reader.rkt:183:2: wrap-internal
   /home/pasterack/racket68/collects/racket/../syntax/module-reader.rkt:65:9: lang:read-syntax
   /home/pasterack/racket68/share/pkgs/scribble-lib/scribble/private/manual-code.rkt:112:0: get-tokens
   /home/pasterack/racket68/share/pkgs/scribble-lib/scribble/private/manual-code.rkt:56:0: typeset-code15
   /home/pasterack/pasterack/tmp/99121/99121code.scrbl: [running body]
   loop
   ...cket/cmdline.rkt:179:51
   /home/pasterack/racket68/share/pkgs/scribble-lib/scribble/run.rkt: [running body]