RacketのMacroを調べてみる (5)
再掲
実はもうほとんどsyntax-caseになってます
(define-syntax (our-if-using-match stx)
(match (syntax->list stx)
[(list name condition true-expr false-expr)
(datum->syntax stx `(cond [,condition ,true-expr]
[else ,false-expr]))]))
syntax-caseを使うとこうなります
(define-syntax (our-if-using-syntax-case stx)
(syntax-case stx ()
[(_ condition true-expr false-expr)
#'(cond [condition true-expr]
[else false-expr])]))
バッククォートの中ではカンマでアンクォートしてやる必要がありましたが
syntax-caseの#'(syntaxの略記でした)の中では不要です
よりシンプルになります
このマクロの場合はさらにシンプルに書けます
(define-syntax-rule (our-if-using-syntax-rule condition true-expr false-expr)
(cond [condition true-expr]
[else false-expr]))
わかってて使う分にはいいんですが、define-syntax-ruleから覚えて
しくみがわかってないと、ちょっと難しいことをしようとするとワケがわからなく
なってしまうぞ、というのが元記事作者の主張
パターンとテンプレートはRacket Guideにわかりやすく書いてあるので
そっちみてね、とのこと