マクロ(2)

30分プログラム、その48。マクロを定義できるようになろう、シリーズ。
Scheme 入門 15. 構文の定義を参考に、when/unless/andを定義してみる。

(define-syntax mac
  (syntax-rules()
    ((_ var) 
     (print (macroexpand-1 'var)))))
 
(define-syntax my-when
  (syntax-rules()
    ((_ pred b1 ...)
     (if pred (begin b1 ...)))))
 
(define-syntax my-unless
  (syntax-rules()
    ((_ pred b1 ...)
     (if pred '() (begin b1 ...)))))
 
(define-syntax my-and
  (syntax-rules()
    ((_ e) e)
    ((_ e1 e2 ...)
     (let1 t e1
	   (if t (my-and e2 ...) #f)))))
  • _はマクロ名になるらしいです
  • ...はずるい