#:g1: srfi-4-comprehensionsの紹介

Posted 2014-09-18 07:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の261日目です。

srfi-4-comprehensionsとはなにか

 srfi-4-comprehensionsは、Sebastian Egner氏作の単一型のベクタをSRFI 42で扱えるようにするためのライブラリです。

パッケージ情報

パッケージ名srfi-4-comprehensions
Chicken eggs:srfi-4-comprehensions - The Chicken Scheme wiki

インストール方法

$ sudo chicken-install srfi-4-comprehensions

すれば、

(use srfi-42 srfi-4-comprehensions)

で使えます。

試してみる

 srfi-4-comprehensionsで拡張されているのは、vector-ecと、vector-of-length-ecです。
これらの動作は

(vector-ec (: e '#(1 2 3 4 5)) (* 2 e))
;=> #(2 4 6 8 10)

(vector-of-length-ec 5 (: e '#(1 2 3 4 5)) (* 2 e)) ;=> #(2 4 6 8 10)

みたいな感じですが、これらがそれぞれ、

の型ごとに定義されています。
動作は下記のようなところですが、vector-なんとか-ec のvectorは返り値の型のことなので、標準で定義されていないlistやvector以外は、入力でも別途指定する必要があります。

(u8vector-ec (: e '#(1 2 3 4 5)) (* 2 e))
;=> #u8(2 4 6 8 10)

(u8vector-ec (:u8vector e '#u8(1 2 3 4 5)) (* 2 e)) ;=> #u8(2 4 6 8 10)

(let* ((vec '#u8(1 2 3 4 5)) (len (u8vector-length vec))) (u8vector-of-length-ec len (:u8vector e vec) (* 2 e))) ;=> #u8(2 4 6 8 10)

 ちなみに、vector-ecとvector-of-length-ecの違いですが、前者がリストに出力してからベクタに変換するのに対して、後者は長さが与えられているのでベクタを作成して埋めていくので効率が良い、というところみたいです。

まとめ

 今回は、srfi-4-comprehensionsを紹介してみました。
型ごとに関数が別だと分かり易い反面、面倒臭いですね。

comments powered by Disqus