Changeset 13019 in project


Ignore:
Timestamp:
01/17/09 01:54:13 (11 years ago)
Author:
Kon Lovett
Message:

Added 'finally' (optional) to dotimes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • release/3/miscmacros/miscmacros.scm

    r6563 r13019  
    6565;; repeat body n times, w/ countup n bound to "var"
    6666;;
    67 (define-macro (dotimes NV . BODY)
    68   (if (and (list? NV) (eqv? 2 (length NV)))
    69                 (let ([V (car NV)]
    70                                         [N (cadr NV)]
     67;; NVF: (<variable> <expression> [<finally>])
     68;;
     69(define-macro (dotimes NVF . BODY)
     70  (if (and (list? NVF) (<= 2 (length NVF) 3))
     71                (let ([V (car NVF)]
     72                                        [N (cadr NVF)]
     73                                        [F (if (= 3 (length NVF)) (caddr NVF) '(begin))]
    7174                                        [N-VAR (gensym)]
    7275                                        [LOOP-TAG (gensym)])
    7376                        `(let ,LOOP-TAG ([,V 0] [,N-VAR ,N])
    74                                 (when (< ,V ,N-VAR)
    75                                         ,@BODY
    76                                         (,LOOP-TAG (add1 ,V) ,N-VAR) ) ) )
    77                 (syntax-error 'dotimes "not a binding form" NV) ) )
     77                                (cond [(< ,V ,N-VAR)
     78                                             ,@BODY
     79                                             (,LOOP-TAG (add1 ,V) ,N-VAR)]
     80                                            [else
     81                                              ,F] ) ) )
     82                (syntax-error 'dotimes "not a binding form" NVF) ) )
    7883
    7984(define-macro (while x . xs)
Note: See TracChangeset for help on using the changeset viewer.