CLでSRFI-58 — #:g1

Posted 2012-03-09 14:57:00 GMT

CLでSRFI、今回は、SRFI-58の「Array Notation」です。
Arrayの記法は、他のSRFIでもあったりするのですが、SRFI-63の要素が均一な型のアレイと併用することを想定しているような記法です。
rankAdimentionsTypeContentsのような構成で結構複雑です。

動作

(list #A:fixN8b(0 0 0)
      #A1*3:fixN8b(1 1 1)
      #1A:fixN8b(2 2 2))
;=>  (#(0 0 0) #(1 1 1) #(2 2 2))

(let ((a #A2*3:fixN8b((0 0 0) (0 0 0) (0 0 0))))
  (srfi-63:array-set! a 100 2 2)
  (list (srfi-63:array-ref a 2 1)
        (srfi-63:array-ref a 2 2)))
;=>  (0 100)

;;; 

(defvar fred #A8*8:fixN8b((0 0 0 0 0 0 0 0)
                          (0 0 0 0 0 0 0 0)
                          (0 0 0 0 0 0 0 0)
                          (0 0 0 0 0 0 0 0)
                          (0 0 0 0 0 0 0 0)
                          (0 0 0 0 0 0 0 0)
                          (0 0 0 0 0 0 0 0)
                          (0 0 0 0 0 0 0 0)))
;=>  FRED

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

(srfi-63:array-set! freds-diagonal 88 3)
;=>  88

(srfi-63:array-ref fred 3 3)
;=>  88

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

(srfi-63:array-ref freds-center 0 0)
;=>  88

移植について

ややこしいので適当にうっちゃってます。実際に使って問題が出たら、都度修正していこうかなと…。 ■

comments powered by Disqus