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)))