#:g1: coerceの紹介

Posted 2014-06-08 09:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の159日目です。

coerceとはなにか

 coerceは、Kon Lovet氏作のChicken用の型変換や型の判定のユーティリティです

パッケージ情報

パッケージ名coerce
Chicken eggs:coerce - The Chicken Scheme wiki

インストール方法

$ sudo chicken-install coerce

すれば、

(use rest-bind)

(require-extension coerce)

で使えます。

試してみる

 Common Lispに型変換の為のCOERCE関数と、型判定のTYPE-OFがありますが、ほぼそのままです。
型判定関係は、

(map type-of (list 1 'a '#(a b c) '(a b c) (current-output-port) (if #f #f)))
;=> (fixnum symbol vector pair output-port unspecified)

(same-type? 1 1) ;=> #t

のような感じ。

 型変換は、

(coerce '(1 2 3 4) 'vector)
;=> #(1 2 3 4)

(coerce "madalto" 'vector) ;=> #(#\m #\a #\d #\a #\l #\t #\o)

(coerce '#(#\m #\a #\d #\a #\l #\t #\o) 'string) ;=> "madalto"

という風にCommon Lispと同様の形式。

 Common Lispと違って拡張もできます。

(define (unspecified? obj) (eq? (void) obj))

(define unspecified-coerce (case-coerce ((char) #\nul) ((number) +nan) ((string) "") ((symbol) '||) ((list) (list)) ((vector) (vector))))

(coerce-extend! 'unspecified unspecified? unspecified-coerce)

(coerce (void) 'number) ;=> +nan.0 (coerce (if #f #f) 'list) ;=> ()

まとめ

 今回は、coerceを紹介してみました。
Schemeだと大抵foo->bar、bar->fooが定義されていますが、coerceみたいなインターフェイスもそれなりに便利ではありますね。

comments powered by Disqus