(define-syntax my-if
  (syntax-rules (then else)
    [(_ e1 then e2 else e3)
     (if e1 e2 e3)]
    [(_ e1 then e2) (if e1 e2)]
    ))

(my-if (< 4 6) then 7 else 8)

(define-syntax ++
  (syntax-rules ()
    [(_ x) (begin (set! x (add1 x)) x)]))

(define a 5)
(++ a)
a

(define-syntax ++post
  (syntax-rules ()
    [(_ x)
     (let ([temp x])
       (++ x)
       temp)]))

(define b (++post a))
(list a b)

(expand '(my-if (< 4 6) then 7 else 8))
(if (#2%< 4 6) 7 8)

(define-syntax my-and
  (syntax-rules ()
    [(_) #t]
    [(_ e1) e1]
    [(_ e1 e2 ...) (if e1
		       (my-and e2 ...)
		       #f)]))

(my-and)
(my-and 5)
(my-and (< a 10) 4 12)

(define-syntax for
  (syntax-rules (:)
    [(_ ((init ...) : test : update ...)
	body ...)
     (begin
       init ...
       (let loop ()
	 (if test
	     (begin
	       body ...
	       update ...
	       (loop)))))]))

(for (((define i 0) (define j 1)) :
      (< i 12) :
      (++ i)
      (set! j (* 2 j)))
     (display i) (display "   ")
     (display j) (display "   ") (newline))