kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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にわかりやすく書いてあるので
そっちみてね、とのこと