match!

すごく久しぶりにSchemeを触っています。相変わらずとても心地良いのよい言語です。


Schemeにはパターンマッチライブラリとかないのかな〜と思って探していると、
「Andrew Wright match」なるものがあることを知りました。matchに待ったパターンマッチ!


それと、気がつくとIronSchemeがRCになっていました。とうとうここまで来たか。
というわけで処理系はIronScheme、開発環境はVisual Studio 2008を使いました。

(import (rnrs) (match) (srfi :26))
;; Pat    ::= (Pat ... . Pat)
;;         || (Pat . Pat)
;;         || ()
;;         || #(Pat* Pat ... Pat*)
;;         || #(Pat*)
;;         || ,Id
;;         || ,(Id*)
;;         || ,(Cata -> Id*)
;;         || Id

(define (test1 lst)
    (match lst
        (() 0)
        ((,x ,y) (+ x y))
        ((,x ,y ,z) (* x y z)) ))

(define (my-map f lst)
    (match lst
        (() '())
        ((,x . ,xs) (cons (f x) (my-map f xs))) ))
        
(display (test1 '(8 2)))
(newline)
(display (test1 '(2 4 5)))
(newline)
(display (my-map (cut expt 2 <>) '(0 1 2 3 4 5)))

10
40
(1 2 4 8 16 32)
変数にいちいち鼻くそ(!)みたいなの付けなきゃいけないのがやや不満ですが、無事動いてmatch売りの少女サチコもご満悦。