Advertisement
Guest User

Untitled

a guest
Jul 11th, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 4.20 KB | None | 0 0
  1. #lang racket
  2. (require (for-syntax syntax/parse))
  3.  
  4. (define-syntax (loop stx)
  5.   (define it (datum->syntax #`k `it))
  6.  
  7.   (define-syntax-class loop
  8.     (pattern (_ v:variable-clause ... m:main-clause ...)
  9.              #:with bindings #`(v.bindings ...)
  10.              #:with actions #`(m.action ...)
  11.              #:with vars #`(m.var ...)
  12.              #:with returns #`(m.return ...)))
  13.  
  14.   (define-syntax-class compound-form
  15.     (pattern (e:expr ...)))
  16.  
  17.   (define-splicing-syntax-class variable-clause    
  18.     (pattern (~seq c:for-as-clause)
  19.              #:with bindings #`c.bindings))
  20.  
  21.   (define-splicing-syntax-class main-clause
  22.     (pattern (~seq c:unconditional)
  23.              #:with action #`void
  24.              #:with var #`()
  25.              #:with return #`())
  26.     (pattern (~seq c:list-accumulation)
  27.              #:with action #`c.accum
  28.              #:with var #`c.var
  29.              #:with return #`(#,it))
  30.     (pattern (~seq c:conditional)
  31.              #:with action #`#f
  32.              #:with var #`#f
  33.              #:with return #`#f))
  34.  
  35.   (define-splicing-syntax-class unconditional
  36.     (pattern (~seq (~datum do) ~! f:expr)
  37.              #:with action #`f)
  38.     (pattern (~seq (~datum return) ~! f:expr)
  39.              #:with action #`()))
  40.  
  41.   (define-syntax-class accumulation-target
  42.     (pattern t:expr)
  43.     (pattern (~datum it)
  44.              #:with t it))
  45.  
  46.   (define-syntax-class list-accumulation-type
  47.     (pattern (~datum collect))
  48.     (pattern (~datum append)))
  49.  
  50.   (define-splicing-syntax-class list-accumulation
  51.     (pattern (~seq type:list-accumulation-type ~! target:accumulation-target (~optional (~seq (~datum into) ~! v:id)))
  52.              #:with accum (with-syntax ([var (if (attribute v) #`v it)])
  53.                             (syntax-parse #`type
  54.                               [(~datum collect) #`(set! var (cons target var))]
  55.                               [(~datum append) #`(set! var (append target var))]))
  56.              #:with var (if (attribute v) #`v it)))
  57.  
  58.   (define-splicing-syntax-class conditional
  59.     (pattern (~seq (~datum when) ~! f:expr c:selectable-clause (~seq (~datum and) ~! cs:selectable-clause) ...)))
  60.  
  61.   (define-splicing-syntax-class selectable-clause
  62.     (pattern c:unconditional)
  63.     (pattern c:conditional)
  64.     (pattern c:list-accumulation))
  65.  
  66.   (define-splicing-syntax-class termination-test
  67.     (pattern (~seq (~datum while) ~! f:expr)))
  68.  
  69.   (define-splicing-syntax-class for-as-clause
  70.     (pattern (~seq (~or (~datum for) (~datum as)) ~! c:for-as-subclause (~seq (~datum and) ~! cs:for-as-subclause) ...)
  71.              #:with bindings #`(c.form cs.form ...)))
  72.  
  73.   (define-splicing-syntax-class for-as-subclause
  74.     (pattern (~seq c:for-as-in-list)
  75.              #:with form #`(c.var (in-list c.f)))
  76.     (pattern (~seq c:for-as-across)
  77.              #:with form #`(c.var (in-vector c.f))))
  78.  
  79.   (define-splicing-syntax-class for-as-in-list
  80.     (pattern (~seq var:id (~datum in) ~! f:expr)))
  81.  
  82.   (define-splicing-syntax-class for-as-across
  83.     (pattern (~seq var:id (~datum across) ~! f:expr)))
  84.  
  85.   (syntax-parse stx
  86.     [l:loop
  87.      #`(let-syntax ([helper
  88.                      (λ (stx)
  89.                        (syntax-case stx ()
  90.                          [(_ (((bvar expr) (... ...))) (action) (var))
  91.                           #`(let ([var `()])
  92.                               (for* ([bvar expr] (... ...)) action)
  93.                               var)]
  94.                          [(_ (((bvar expr) (... ...)) ((bvars exprs) (... ...)) (... ...))
  95.                              (actions (... ...) action)
  96.                              (vars (... ...) var))
  97.                           #`(let ([var `()])
  98.                               (for* ([bvar expr] (... ...))    
  99.                                 action
  100.                                 (#,(datum->syntax stx `helper) (((bvars exprs) (... ...)) (... ...))
  101.                                                                (actions (... ...))
  102.                                                                (vars (... ...))))
  103.                               var)]))])
  104.          (helper l.bindings l.actions l.vars))]))
  105.  
  106. (define lst (loop for x in (list 1 2 3 4 5) and y across (vector 6 7 8 9 10) collect `(,x ,y)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement