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