--- title: Lispでシュワルツ変換 author: kazu634 date: 2010-05-11 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:5251;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---

id:higeponさん主催のコードバトンで学んだシュワルツ変換。いま自分用のスクリプト作りのためにもう一度使っている。こんな感じ:

(define (list-sort-by key-fn cmp xs)
(map cdr
(sort
(map
(lambda (x) (cons (key-fn x) x))
xs)
(lambda (a b) (cmp (car a) (car b))))))

こういうの考える人って頭いいなぁと思う。実行例はこんな感じになる:

gosh> (define data '((foo 3) (bar 1) (osaka 2) (okayama 0)))
data
gosh> (list-sort-by (lambda (x) (cadr x)) > data)
((foo 3) (osaka 2) (bar 1) (okayama ))
gosh> (list-sort-by (lambda (x) (cadr x)) < data)
((okayama ) (bar 1) (osaka 2) (foo 3))

上の例だと、リスト内の数字でソートしている。lambdaの中をごにょごにょすれば、任意の場所の値でソートすることが可能。

次はこれを元にして、sortじゃなくてfilterするようにしてみよう。