何度かブログで取り上げているが 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