CLでSRFI-95 — #:g1

Posted 2011-12-10 10:27:00 GMT

半年ぶり位のCLでSRFIですが、今回は、SRFI-95のソートとマージです。

SRFI-95と、Common Lispの標準のsort、mergeとの違いですが、 といったところが主なところになります。
CLでは、keyで読み出しの関数を指定できますが、SRFI-95にも同様の機能があります(キーワード引数ではなくオプショナル引数)

動作例

(srfi-95:sort (list -2 8 5 -4 -4 9 -3 -7 7 1) #'<)
;=>  (-7 -4 -4 -3 -2 1 5 7 8 9)

(srfi-95:sort (list -2 8 5 -4 -4 9 -3 -7 7 1)
              #'<
              (lambda (x) (length (format nil "~R" x))) )
;=>  (1 5 9 8 7 -2 -4 -4 -3 -7)

(defvar *sorted-list* '(-7 -4 -4 -3 -2 1 5 7 8 9))

(srfi-95:sorted? *sorted-list* #'<) ;=> T (defvar *odds* '() ) (defvar *evens* '() )

(multiple-value-setq (*odds* *evens*) (srfi-1:partition #'oddp *sorted-list*))

(values *odds* *evens*) ;=> (-7 -3 1 5 7 9) ; (-4 -4 -2 8) (srfi-95:merge *odds* *evens* #'<) ;=> (-7 -4 -4 -3 -2 1 5 7 8 9) (equal *sorted-list* (srfi-95:merge *odds* *evens* #'<)) ;=> T

移植について

トランスレータを書いてみようと思っていましたが、150行位なので、ちまちまSchemeからCommon Lispへ変換しました。

comments powered by Disqus