PasteRack.org
Paste # 55006
2016-11-01 18:06:38

Fork as a new paste.

Paste viewed 350 times.


Embed:

  1. #lang racket/base
  2.  
  3. (require (for-syntax
  4.           racket/base
  5.           syntax/parse))
  6.  
  7. (begin-for-syntax
  8. ; A ForClause is either
  9. ;   - (bind-clause (listof identifier) syntax)
  10. ;   - (when-clause syntax)
  11. (struct bind-clause (vars seq-expr) #:transparent)
  12. (struct when-clause (guard) #:transparent)
  13.  
  14. (define-splicing-syntax-class for-clause
  15.   #:attributes (ast)
  16.   (pattern [var:id seq:expr]
  17.            #:attr ast (bind-clause (list #'var) #'seq))
  18.   (pattern [(var:id ...) seq:expr]
  19.            #:attr ast (bind-clause (syntax->list #'(var ...))
  20.                                    #'seq))
  21.   (pattern (~seq #:when guard:expr)
  22.            #:attr ast (when-clause #'guard)))
  23. )
  24.  
  25. (define-syntax (myfor stx)
  26.   (syntax-parse stx
  27.     ((_ (clause:for-clause ...) body:expr)
  28.      #''((clause.ast ...) body))))
  29.  
  30. (myfor ((a '[1 2 3])) a)

=>

program::-1: clause.ast: bad attribute value for syntax

template

  attribute value: (list (bind-clause '(#<syntax:2:0 a>)

#<syntax:2:0 (quote (1 2 3))>))

  expected for attribute: list of depth 1 of syntax

  sub-value: (bind-clause '(#<syntax:2:0 a>) #<syntax:2:0

(quote (1 2 3))>)

  expected for sub-value: syntax

  in: clause.ast