述語と比較関数の合成

30分プログラム、その611。Let Over Lambdaにのってた述語と比較関数を合成する関数が、おもしろかったので作ってみよう。

gosh> (sort  '(1 2 3 4 5 6 7 8) (predicator-compare even? <))
(2 4 6 8 1 3 5 7)

のように使うと、偶数と奇数でグループ分けしつつ、昇順でソートしてくれる。
どういう文脈でこの関数がでてきたか忘れちゃったけど、とりあえず作ってみよう。

使い方

gosh> (sort  '(1 2 3 4 5 6 7 8) (predicator-compare even? <))
(2 4 6 8 1 3 5 7)

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; predicate.scm -
;;
;; Copyright(C) 2009 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2009/06/26 21:54:07
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;

(define (even? n)
  (= (modulo n 2) 0))

(define (predicator-compare p order)
  (lambda (x y)
    (let [(a (p x))
	  (b (p y))]
      (if (eq? a b)
	  (order x y)
	  a))))

(sort  '(1 2 3 4 5 6 7 8) (predicator-compare even? <))