述語と比較関数の合成
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? <))