gauche.arrayを試してみた

30分プログラム、その644。gauche.arrayを試してみた。
Schemeで配列ってどうやって扱うんだろう、とふと疑問に思ったので、gauche.arrayを試してみました。SRFI-25に準拠してるらしいので、ほかのSchemeでも大差ないでしょう、たぶん。

感想は、

  • 配列の開始インデックスが0で固定されてなくて、任意のインデックスから開始できる
  • shapeまわりがややこしい。Shapeはshape関数で作るが、最初リストを渡してしまった
  • それ以外は素直なインタフェース

といった感じです。

試しているときにキューを書いてみたので、いちおう貼っておきますね。

使い方

(define q (make-queue 10))

(enqueue 10 q)
(enqueue 11 q)
(enqueue 12 q)

(dequeue q) ;; 10
(dequeue q) ;; 11
(dequeue q) ;; 12

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; array.scm -
;;
;; Copyright(C) 2009 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2009/08/20 21:12:02
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;
(use gauche.array)

(define (make-queue size)
  (array (shape 0 3)
	 0 0
	 (make-array (shape 0 size))))

(define (queue-begin q)
  (array-ref q 0))

(define (queue-last q)
  (array-ref q 1))

(define (queue-content q)
  (array-ref q 2))

(define (enqueue x q)
  (array-set! (queue-content q)
	      (queue-last q)
	      x)
  (array-set! q 1
	      (modulo (+ 1 (queue-last q))
		      (array-size (queue-content q)))))

(define (dequeue q)
  (let1 i (queue-begin q)
	(array-set! q 0
		    (modulo (+ 1 i)
			    (array-size (queue-content q))))
	(array-ref (queue-content q)
		   i)))