CLでSRFI-47 — #:g1

Posted 2012-02-02 22:19:00 GMT

CLでSRFI、今回は、SRFI-47の「Array」です。
SRFI-25にも配列はありますが、こちらは、主にSLIB方面由来の配列です。SRFI-25と同じようにShared Arrayもサポート。加えて、一様な要素の配列もサポートします。

動作

(make-array (au8) 3)
;=>  #(0 0 0)

(make-array (au8 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方面というより、SLIBそのものです。
参照実装をそのままCommon Lispに持ってきた感じだとアレイのコンテナが一様ベクタになるわけではないのでその辺りをそのうち改善してみたいと思ったりはします。

comments powered by Disqus