(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 (< 7 4) then 5 else 6)
(expand '(my-if (< 7 4) then 5 else 6))
(list (my-if (< 7 4) then 5))

(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)

(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) b (+ 1 b) 12)
(expand '(my-and (< a 10) b (+ 1 b) 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))