4.3 KiB
4.3 KiB
title | author | date | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|
Lispでシュワルツ変換 | kazu634 | 2010-05-11 |
|
|
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するようにしてみよう。