CLでSRFI-63 — #:g1

Posted 2012-02-09 03:03:00 GMT

CLでSRFI、今回は、SRFI-63の「Homogeneous and Heterogeneous Arrays」です。
SRFI-47にとって変わるSRFIのようです。SRFI-47では、配列のプロトタイプの名前がAu8のような名前でしたが、A:fixn8bのように変わっているのに加え、ちょっとしたユーティリティが加えられています。

動作

(make-array (a:fixn8b) 3)
;=>  #(0 0 0)

(make-array (a:fixn8b 1) 3)
;=>  #(1 1 1)

(let ((a (make-array #(:foo) 3 3)))
  (array-set! a :bar 2 2)
  (list (array-ref a 2 1)
        (array-ref a 2 2)))
;=>  (:FOO :BAR)

(defvar fred (make-array '#(nil) 8 8))
;=>  FRED

(defvar freds-diagonal (make-shared-array fred (lambda (i) (list i i)) 8))
;=>  FREDS-DIAGONAL

(array-set! freds-diagonal 'foo 3)
;=>  FOO

(array-ref fred 3 3)
;=>  FOO

(defvar freds-center
  (make-shared-array fred (lambda (i j) (list (+ 3 i) (+ 3 j)))
                           2 2))
;=>  FREDS-CENTER

(array-ref freds-center 0 0)
;=>  FOO

移植について

SLIBのarray.scmが参照実装のようです。
A:fixn8bのような名前のコロンはCLではパッケージマーカなのでどうしようか毎度悩みますが、エクスポートされている感じで、パッケージ風でもある、aというパッケージを作成しました。

comments powered by Disqus