フェンダー

何度かブログで取り上げているが Scheme (R7RS) でパターンマッチライブラリ pattern-match-lambda を作っている。

https://github.com/SaitoAtsushi/pattern-match-lambda

case-lambda に syntax-rules 風 (省略子はない) のパターンマッチをくっつけたような使い勝手にしたつもりだ。 ドキュメントを書いていないのだが、テストコードを見ればおおよその使い方はわかるだろう。

今回は syntax-case にあるようなフェンダーの機能を追加した。 フェンダーという言葉は馴染みがないだろうが、ガードといえばわかるだろうか。 パターンにマッチさせた上で更に条件を付ける機能である。 パターンの後に述語があれば、それがフェンダーとして機能する。

(define example
  (pattern-match-lambda ()
    ((x) (string? x) 'string)
    ((x) 'not-string)))

(example "1")  ;; => string
(example 1)    ;; => not-string

過酷に syntax-rules を使い倒しているためか、残念ながら今のところ完全に解釈できる R7RS 処理系は foment くらいしかない。 husk で動かないのは暗黙の import の問題なのでライブラリに分けなければ動作はするようだ。

Document ID: 7fece40caa16d39d38c44ae2253b3521