match.scm

30分プログラム、その36。

util.matchを試してみよう。

(use util.match)
(define head (match-lambda
	      ((x . _ ) x)))
 
(define tail (match-lambda
	      ((_ . xs) xs)))
 
(define fact (match-lambda
	      (0 1)
	      (n (* n (fact (- n 1))))))
 
(define (my-map f lst)
  (match lst
	 (() ())
	 ((x . xs) (cons (f x)
			 (my-map f xs)))))
 
(define (my-append lst ys)
  (match lst
	 (() ys)
	 ((x . xs) (cons x
			 (my-append xs ys)))))

(define (my-filter p lst)
  (match lst
	 (() ())
	 ((x . xs) (if (p x)
		       (cons x (my-filter p xs))
		       (my-filter p xs)))))
 
(define (my-fold-right f init lst)
  (match lst
	 (() init)
	 ((x . xs)
	  (f x
	     (my-fold-right f init xs)))))
  • なんか再実装祭りになった
  • fold-leftの実装を忘れた