summaryrefslogtreecommitdiff
path: root/src/scheme/ao_scheme_do.scheme
blob: 063e4a38b53702419cb162a2420d2e53f074f291 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
(define do
  (macro (vars test . cmds)
    (define (_step v)
      (if (null? v)
	  '()
	  (if (null? (cddr (car v)))
	      (_step (cdr v))
	      (cons `(set! ,(caar v) ,(caddr (car v)))
		    (_step (cdr v))
		    )
	      )
	  )
      )
    `(let ,(map (lambda (v) (list (car v) (cadr v))) vars)
       (while (not ,(car test))
	      ,@cmds
	      ,@(_step vars)
	      )
       ,@(cdr test)
       )
    )
  )

(do ((x 1 (+ x 1)))
    ((= x 10) "done")
  (display "x: ")
  (write x)
  (newline)
  )

(do ((vec (make-vector 5))
     (i 0 (+ i 1)))
    ((= i 5) vec)
  (vector-set! vec i i))