Gauche-gtk2 0.6.2
マイナーアップデート。APIをひとつ足したのと、新しめのGaucheへの適応。
Practical Scheme Scripting
実用環境でのスクリプティングに照準を合わせた高速なR7RS Scheme実装です
マイナーアップデート。APIをひとつ足したのと、新しめのGaucheへの適応。
素早い立ち上がり、OSとのスムーズな統合、 表現力の高い構文により、シェルスクリプト的なツールや、 日々の業務の自動化に最適です。
ネットワーク、Unicode文字列と正規表現、 スレッド、各種アルゴリズムとデータ構造、 他、多くの機能がすぐに使えます。
R7RS (smallとlarge) 互換であり、 また大半のfinalizeされたSRFIをサポートします。 さらに、統合された遅延シーケンスや、 メタオブジェクトプロトコルを備えたオブジェクトシステム等の言語拡張が採り入れられています。
20年以上に渡って現場で使われており、 安定性と互換性、そして長期にわたるメンテナンスを重視しています。
;; フィボナッチ数列を生成するジェネレータ。 ^ は lambda の略記。
(define (make-fib-gen)
(let ([a 1] [b 1])
(^[] (let1 c (+ a b) (rotate! a b c)))))
;; フィボナッチ数の無限遅延リスト
(define *fibs* (generator->lseq (make-fib-gen)))
;; フィボナッチ数の最初の20項を取る
(take *fibs* 20)
;⇒ (1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765)
;; 100番目のフィボナッチ数は?
(~ *fibs* 100)
;⇒ 573147844013817084101
;; 2^64を超える最初のフィボナッチ数は何番目?
(use scheme.list)
(length (take-while (cut > (expt 2 64) <>) *fibs*))
;⇒ 93
;; フィボナッチ螺旋を描いてみよう
(use gauche.lazy)
(define (fib-spiral xsize ysize)
;; 1/4円弧の始点となる点列。複素数を使うことで回転は単なる掛け算になる
(define *Pn*
(lmap-accum (^[Fn rot acc]
(let1 next (+ acc (* rot (make-rectangular Fn Fn)))
(values acc next)))
0 *fibs* (circular-list 1 -i -1 +i)))
(define (draw-arc Fn Pn Pn+1)
(format #t "<path d='M ~a ~a A ~a ~a 0 0 0 ~a ~a' fill='none' stroke='black'/>\n"
(real-part Pn) (imag-part Pn) Fn Fn (real-part Pn+1) (imag-part Pn+1)))
;; SVGを生成
(print #"<svg xmlns='http://www.w3.org/2000/svg' \
viewBox='~(- xsize) ~(- ysize) ~(* xsize 2) ~(* ysize 2)'>")
(for-each draw-arc
*fibs*
(take-while (^p (or (< (abs (real-part p)) xsize)
(< (abs (imag-part p)) ysize)))
*Pn*)
(cdr *Pn*))
(print "</svg>"))
;; 生成したSVGをファイルに保存
(with-output-to-file "fib-spiral.svg" (cut fib-spiral 600 480))
生成されたsvgファイル:
Schemeコミュニティの議論で制定される SRFI を含め、Gaucheのライブラリと拡張モジュールは続々と開発されています。
gauche-packageコマンドによるパッケージ管理