
; QUASIQUOTE
(assert (equal? `(1 2 3) '(1 2 3)))

(let ((x 1))
  (assert (equal? `(,x 2 3) '(1 2 3))))

(let ((x 'a))
  (assert (equal? `(,x x ,x) '(a x a))))


; nil! macro
(define-macro nil! (lambda (x)
                     `(set! ,x '())))

(define x 3)
(assert (= x 3))
(nil! x)
(assert (null? x))

; ntimes macro

(define-macro ntimes (lambda (n . body)
        (let ((i (gensym)))
             (cons 'DO (cons `((,i 0 (+ ,i 1)))
                        (cons `((>= ,i ,n) '()) body))
                ))))

(define x 0)
(ntimes 10 (set! x (+ x 1)))
(assert (= x 10))


