マクロ(1)

30分プログラム、その44。Schemeでマクロを書いてみよう。

書き方を調べるのに時間がかかったので、内容そのものはしょぼい。
(set! val '())の略記であるnil!と、数字用のifことnif。nifは条件部が正かゼロか負によって実行する節を変えるちょっとかわったif。

gosh> (define x 10)
gosh> (nil! x)
()
gosh> x
()
gosh> (map (lambda(x) (nif x 'p 'z 'n)) '(0 2 -8))
(z p n)
(define-syntax nil!
  (syntax-rules()
    ((nil! var) (set! var '()))))
 
(define-syntax nif
  (syntax-rules()
    ((nif expr pos zero neg)
     (let1 val expr
	   (cond
	    ((> val 0) pos)
	    ((= val 0) zero)
	    ((< val 0) neg))))))
  • なんて書きやすいんだっ!
  • syntax-rulesで定義すると、マクロが健全になるらしいです。ようするに変数キャプチャは絶対におきないそうです。アナフォリックマクロが定義できんやん
  • マクロ展開がどこまでおこなわれて、どこから実行時に実行されるのか見分けられない