(import (scheme base)
        (picrin macro))

(define-syntax aif
  (ir-macro-transformer
   (lambda (form inject cmp)
     (let ((it (inject 'it))
           (expr (car (cdr form)))
           (then (car (cdr (cdr form))))
           (else (car (cdr (cdr (cdr form))))))
       `(let ((,it ,expr))
          (if ,it ,then ,else))))))

(aif (member 'b '(a b c)) (car it) #f)

;;; test hygiene begin

(define-syntax mif
  (ir-macro-transformer
   (lambda (form inject cmp)
     (let ((expr (car (cdr form)))
           (then (car (cdr (cdr form))))
           (else (car (cdr (cdr (cdr form))))))
       `(let ((it ,expr))
          (if it ,then ,else))))))

(let ((if 42))
  (mif 1 2 3))
; => 2

(let ((it 42))
  (mif 1 it 2))
; => 42

;;; end



;;; test core syntax begin

(mif 'a 'b 'c)
; => b

(define-syntax loop
  (ir-macro-transformer
   (lambda (expr inject cmp)
     (let ((body (cdr expr)))
       `(call-with-current-continuation
         (lambda (,(inject 'exit))
           (let f ()
             ,@body (f))))))))

(define a 1)
(loop
 (if (= a 2) (exit #f))
 (set! a 2))
; => #f

(loop
 (define a 1)
 (if (= a 1) (exit #f)))
; => #f

;;; end