CLでSRFI-67 — #:g1

Posted 2012-02-01 01:13:00 GMT

CLでSRFI、今回は、SRFI-67の「Compare Procedures」です。
比較演算子詰め合わせという感じで沢山定義されています。関数を返す関数をどんどん組み合わせて使いますが、その辺りがSchemeっぽいです。

動作

(use-package :srfi-67)
(use-package :srfi-42)

(real-compare 1 2) ;=> -1 (real-compare 1 1) ;=> 0 (real-compare 2 1) ;=> 1 (<? #'real-compare 1 2) ;=> T (>? #'real-compare 1 2) ;=> NIL (=? #'real-compare 1 2) ;=> NIL (chain=? #'real-compare 1 1 1 1) ;=> T (chain<? #'real-compare 1 2 3 4 5) ;=> T (<=/<=? 1 2 3) ;=> T (if=? 1 :true :false) ;=> :FALSE (if=? -1 :true :false) ;=> :FALSE (if=? 0 :true :false) ;=> :TRUE (defun sort-by-less (xs pred) ; trivial quicksort (if (or (null xs) (null (cdr xs))) xs (append (sort-by-less (list-ec (:list x (cdr xs)) (if (funcall pred x (car xs))) x) pred) (list (car xs)) (sort-by-less (list-ec (:list x (cdr xs)) (if (not (funcall pred x (car xs)))) x) pred))))

(sort-by-less '(1 3 2 4 5 8 7) (<?)) ;=> (1 2 3 4 5 7 8) (sort-by-less '(1 3 2 4 5 8 7) (>?)) ;=> (8 7 5 4 3 2 1)

移植について

cond-compare等のelseは、エクスポートのことを考えて:elseにしてみました。
テストを全部通すと、通過するテストは99486個らしいのですが、全部通してる筈なのに95381個になります。とりあえず、間違った値によってエラーになっていないので放置。Schemeで動かしてみて、全部通ったら99486個になるのか確認してみたいところです…。

comments powered by Disqus