ホーム | 機能 | ダウンロード | 拡張パッケージ | ドキュメント | 開発状況 -> English | -> Practical Scheme

Gauche(ゴーシュ)は、スクリプトインタプリタとしての使い易さに重点を置いて 開発を行っているR5RS準拠のScheme処理系です。日常業務の中でのちょっとした処理を行う スクリプトを気軽にSchemeで書きたいなあ、という願望のもとに、 起動が速いこと、システムへのアクセスが組み込まれていること、 最初から多国語対応を考慮していること、 リスト処理ライブラリとして他のC/C++プログラムから簡単にリンク可能であること、 などを目標としています。

Gaucheは今のところ、いくつかのUnixプラットフォーム で動作します。

実装されている機能の概要については、 機能のページをご覧ください。

News

詳しい変更はChangeLogをどうぞ。 また、最新の開発状況はGitリポジトリで知ることができます。

2013/4/16

ソースコードリポジトリをGitHubに移行しました: https://github.com/shirok/Gauche。開発版を追っかけている方はoriginを変更してください。

(ファイルリリースやメーリングリストはSourfeForge.netに止まります。リポジトリだけの移行です。

2012/5/28

Gauche 0.9.3.3 - マイナーバグフィクスリリース

0.9.3.2からいくつかのバグフィクスと、2つばかり新機能の追加です。 バグのひとつが、ある条件でビルドが失敗するというものだったので、 新たなリリースにした方が良いと判断しました。

  • バグフィクス:
    • DESTDIRが設定されて、以前のGaucheがインストールされていない 環境でmake installを実行しようとすると "libgauche-0.9.so.0.3: cannot open shared object file: No such file or directory" といったエラーを 出してmakeが止まるという問題を修正しました。
    • FreeBSDで、シグナルハンドリングの初期設定ルーチンが予期せぬメモリ破壊を 起こしていました。
    • everyに2つ以上の引数リストが与えれた場合、 全ての引数が条件を満たした際の返り値が、 srfi-1に指定されているように述語の最後の戻り値ではなく、 #tになるというバグがありました。 また、stream-everyにも同様のバグがありました。
    • MinGWでREPLからのinfoが動かなかったのを修正しました。
    • MinGWで、コンソールを作らないgosh-noconsole.exeを使って スクリプトを実行し、そこから子プロセスを起動してパイプで通信しようとすると gosh-noconsole.exeが落ちてしまうというバグを直しました。
  • 改善:
    • New procedure: string-scan-right
    • GC is now 7.2b

2012/5/11

Gaucheがutf-8以外の文字エンコーディングを使うようにconfigureされた場合に ドキュメントのビルドに失敗するという問題が見つかったので、これを修正したリリース(0.9.3.2) を出しました。Gaucheをデフォルトのutf-8以外のエンコーディングでコンパイルしたい 場合はダウンロードしてください。utf-8でコンパイルする場合は急いでアップデート する必要はありません。

2012/5/10

Windows/MinGW上で0.9.3リリース版がgit HEADバージョンをコンパイルできない という問題が見つかったので、修正したバージョン(0.9.3.1)を用意してあります。 他のプラットフォームには影響はありません。

2012/5/9

Gauche 0.9.3

  • 新機能
    • 遅延シーケンス: 効率良く動作し、通常のリスト手続きと シームレスに混ぜて使える、遅延評価リストがサポートされます。 遅延シーケンス内の遅延評価のforceは自動的に行われるので、 遅延シーケンスをcarfoldといった 通常のリスト手続きにそのまま渡すことができます。詳しい説明および例は マニュアルのエントリを 参照してください。
    • gauche.generator: 呼ばれる度に値を生成する手続きである ジェネレータを統一的に扱うユーティリティです。 遅延シーケンスもジェネレータを基に作られています。 詳しくはマニュアルを どうぞ。
    • Windows/MinGWビルドでスレッドが使えるようになりました。 pthreadsではなくWin32 thread APIを直接使っています。Scheme レベルで違いが見えることはほとんどありませんが、 cond-expandが拡張され、スレッドサポート自体の有無と スレッドモデルの違いそれぞれを見分けられるようになっています。 マニュアルのThreadsの項参照。
    • add-load-pathマクロに、「現在ロード中のファイルからの相対パス」 でロードパスを追加できるオプションがつきました。 この機能は、ライブラリを伴ったスクリプトを配布するのに便利です。例えば スクリプトファイル内で(add-load-path "." :relative) とすれば、それ以降、そのスクリプトのあるディレクトリからライブラリが 探されます。ユーザはディレクトリごと好きな場所にコピーして、 どこからでも起動することができます。
    • 関数呼び出しをチェインする$マクロを正式にサポートしました。 モジュールgauche.experimental.appで長らく実験されてたものです。 このマクロを使うと(f a b (g c d (h i j)))($ f a b $ g c d $ h i j)と書くことができます。文字数的には 後者の方が長いのですが、特に関数のネストが深くなった時に、 後者の方がインデントしやすいことが多いです。 マニュアルに詳しい説明があります。
    • goshにオプション-m moduleが追加されました。 この指定があると、プログラムのエントリポイントである main手続きを、デフォルトのuserモジュールではなく 指定されたモジュール内で探します。この機能は、一つのファイルを ライブラリモジュールとしても実行可能なスクリプトとしても使うことを 可能にします(例えば、スクリプトとして実行した場合にテストやデモを 走らせる等)。テストプログラムをmainという名前にして、 それをexportしないでおきます。ライブラリとしてuseした場合には そのmain手続きは見えないので何の影響も与えません。 一方、goshを-mオプションで起動すればmain 手続きからプログラムを実行することができます。
  • 非互換な変更
    • util.queue: 容量(max-length)がゼロの スレッドセーフキュー(mtqueue)を作れるようになりました。 同期デバイスとして便利です。以前のバージョンでは :max-lengthに0を渡すと「容量制限なし」を意味していたので、 これは非互換な変更となります。 (Cf: Queue of zero length).
    • 正規表現の先頭/末尾アサーション (^, $) が (?=...)等のアサーショングループの中で認識されていなかった バグを修正しました。先頭/末尾アサーションに関しては、 アサーショングループ自体がスタンドアロンであるかのように解釈されます。 これはPerlや鬼車の動作と同じです。しかし、以前の(バギーな)動作に 依存しているプログラムは動かなくなるかもしれません。
    • gauche.auxsysモジュールが無くなりました。 このモジュールはいくつかのシステム手続きを含んでいて、これまでオートロード されていたのですが、本バージョンからコアに統合されました。ほぼ影響は 出ないと思いますが、何らかの事情でこのモジュールを明示的に読み込んでいる 場合は、その部分を削ってください。
  • 改善
    • 頻繁に使われるリスト手続きの多くをコアでサポートしました (util.listの全て、及びsrfi-1の多く)。 util.listはもう必要ありません。互換性のためにダミーモジュール は残してありますが。srfi-1からは次の手続きがコアに移されています。 null-list?, cons*, last, member (extended one), take, drop, take-right, drop-right, take!, drop-right!, delete, delete!, delete-duplicates, delete-duplicates!, assoc (extended one), alist-copy, alist-delete, alist-delete!, any, every, filter, filter!, remove, remove!, filter-map, fold, fold-right, find, find-tail, split-at, split-at!, iota.
    • 新たなマクロと手続き:values->list, fold-left, regexp-num-groups, regexp-named-groups.
    • procedure?よりもより的確に 「適用可能かどうか」を調べられる手続き applicable?が追加されました。 またそれに関連して、全てのクラスのサブタイプとなる <bottom>クラスがサポートされました。
    • ソースツリー外からのビルドが可能なようにビルドプロセスを直しました。
    • 正規表現エンジンを少し改良しました。例えば、正規表現の ブロックごとに、先頭にマッチし得る文字のセットを持ち、 繰り返し等はそれを使って高速にスキャンすることで、特に長い入力に対して 性能を改善しています。
    • thread-terminate!が、強制的にスレッドを殺す前に いくつかより穏便な方法を試すようになりました。
    • open-input-file:encoding引数に #tを渡すことで、コーディング認識ポートを使ってファイルを 読ませることができるようになりました。コーディング認識ポートは ファイルの最初の方にあるcoding: ...という文字コード指定を 認識します。ソースファイルを処理する場合などに便利です。
    • mapが再スタート可能、すなわち、途中で保存した継続を 再起動した場合に、以前の結果に影響を与えないようになりました。 これはR6RSで要求されている動作です。
    • コンパイラと、VMのスタックレイアウトにいくつか改善を施しました。
    • gauche.test: test-moduleが、グローバルな 手続き呼び出しの引数の数の整合性をチェックするようになりました。 うっかりミスを検出するのに役立ちます。もし、グローバルな定義と 矛盾する呼び出しを意図的にしているコードがある場合は、 :bypass-arity-checkキーワード引数に引っかかる関数名の リストを渡してください (言語の動的な性質から、誤検出の可能性は常に あります。例えばシグネチャの異なるメソッドが後から足されるかもしれません)。
    • gauche.test: test-endに、テストが失敗した 場合に非ゼロの終了ステータスでプロセスを終了させるオプションを追加しました。 また、新しい手続き test-summary-checkによって、それまでのテスト結果ファイルを 調べて失敗があれば非ゼロステータスでプロセスを終了させることもできます。 これらは、テスト失敗を上位層 (継続ビルドサーバなど) に伝えるのに 便利です。
    • srfi-42: gauche.generatorの意味でのジェネレータ 手続きをソースとして使うための:generator qualifier を追加しました。
    • file.util: touch-filetouch-files が、touch(1)コマンドに似た色々なキーワード引数を取ります。
    • rfc.http: パラメータhttp-proxyによって デフォルトのhttp proxyを指定できます。また、https接続に、 外部のstunnelコマンドでなく Gauche自体がサポートするライブラリを使うようになりました。
    • GCのバージョンを7.2-alpha6にしました。
  • バグフィクス
    • 非正確数が与えられた時にdivmodが妙な丸めを していたのを修正しました。
    • /.で、除数と被除数共にIEEE浮動小数点数で表現できないほど大きな 数が与えられた場合に動作がおかしかったのを修正しました。
    • 準クオート展開ルーチンがunquoteunquote-splicingを 健全に扱うようになりました。
    • forceがスレッドセーフでなかったのを修正。
    • ファイルのロード、requireにスレッドセーフでない箇所がいくつかありました。 バグを追いかけてくれたKirill Zorin氏に感謝。
    • (regexp-compile '(alt))がBus Errorになっていたのを修正。
    • 大文字小文字を区別しない正規表現がASCIIを越えた文字について動かなくなって いたのを修正。OOHASHI Daichi氏のパッチです。
    • gauche.parameter: 関係の無いスレッドで作られたパラメータを 使おうとするとこれまではエラーになっていましたが、 autoloadのタイミングによって意図せずそういう状況が発生することがあり、 あまり嬉しくないので、どのスレッドで作られようがパラメータはグローバルに 使えるようにしました。
    • rfc.json: JSON生成ルーチンが不正なJSONを作ることがあるバグを修正。
    • rfc.http: 3xxレスポンスに対するリダイレクトの動作を 規格にそったものにしました。また、その動作をカスタマイズすることも可能です。
    • gauche.threads: thread-sleep!に正確な非整数有理数 が渡された場合の動作がバグってました。
    • util.stream: stream-countが動作していませんでした。

古いニュース

Stay Informed

Gaucheに関するアナウンスやディスカッションを行うメイリングリストを 作成しました。リンクをクリックすると登録やアーカイブの参照を行うページに飛びます。 日本語MLに入る方は、できれば英語MLにも入っておいて下さい (話題の重複を避けるため)。

Acknowledgments

Gaucheの開発の一部(2003年9月〜2004年2月)は 情報処理振興事業協会(IPA)による 平成15年度オープンソフトウェア基盤整備事業の支援を受けています。

Gauche-gl及びGauche-gtkの開発の一部(2002年7月〜2003年2月)は、 情報処理振興事業協会(IPA)による 平成14年度未踏ソフトウェア創造事業の支援を受けています。