CLでSRFI-25 — #:g1

Posted 2012-01-29 22:15:00 GMT

CLでSRFI、今回は、SRFI-25の「Multi-dimensional Array Primitives」です。
多次元の配列を提供するものですが、CLの配列と違って添字が0開始固定でなかったり、CLのDispraced Arrayより柔軟な、Shared Arrayという仕組みが提供されています(詳細な比較はSRFI-63に解説されています)

動作

(array-ref (array (shape 0 2 1 3) 'a 'b 'c 'd) 0 1)
;=>  A

(let* ((i (make-array (shape 0 4 0 4)
                      0 ))
       (d (share-array i
                       (shape 0 4)
                       (lambda (k)
                         (values k k) ))))
  (do ((k 0 (+ k 1)))
      ((= k 4))
    (array-set! d k 1) )
  (values
   ;; i
   (cl:loop
      :for x :from 0 :below 4
      :collect (cl:loop
                  :for y :from 0 :below 4
                  :collect (array-ref i y x)))
   ;; d
   (cl:loop
      :for x :from 0 :below 4
      :collect (array-ref d x))))
;=>  ((1 0 0 0)
;     (0 1 0 0)
;     (0 0 1 0)
;     (0 0 0 1)),
;    (1 1 1 1)

移植について

SRFI-25だけだと細かい取り回しがきかないので(内部的にはあるようですが)Gaucheのように取り回しのユーティリティが充実していると便利そうです。

comments powered by Disqus