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

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

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

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

News

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

2010/02/01

Gauche 0.9のWindowsバイナリ配布ファイルが、いくつかのアンチウィルスソフト の経験的検出アルゴリズムによって"Dropper"タイプのウィルスと判断されるようです。 SourceForge.netに現在上がっているバイナリは常にウィルススキャンされている開発者の マシンで作成されたもので、これは誤検出であると考えています。念のためオリジナルの バイナリパッケージのmd5を掲載しておきます。

5801c5a91a8e1c09e0a4b1ec30d37dee        Gauche-mingw-0.9.exe
0a1470b3a96e658c8e3c812aca880ffd        Gauchebox-0.9-box1.exe

2009/11/22

Gauche 0.9: 大きな機能拡張

  • C APIの非互換な変更: C APIのいくつかが変更されたので、Cで書かれた拡張モジュール が今のままではコンパイルできないかもしれません。 API Changes in 0.9 を参照してください。
  • 新しい機能
    • 新しいモジュール: rfc.zlib: Zlibによる圧縮/展開。
    • 新しいモジュール: rfc.sha: SHA2のサポート。 rfc.sha1はこのモジュールによって置き換えられます。
    • 新しいモジュール: util.sparse: メモリ効率の良い trieを用いた疎なベクタと、それをバックエンドにしたハッシュテーブルの 実装。ハッシュテーブルに数千万のエントリを保持して置きたい場合は 組み込みのハッシュテーブルよりもメモリ効率が良いです。
    • Autoprovide機能: 大抵の場合において、 'provide'を書く必要がなくなりました。 (require "X")X.scmをロードすることに成功し、 その中にprovideフォームが無かった場合、"X"というfeatureが 自動的にprovideされます。マニュアルの 「requireとprovide」 を参照してください。
    • モジュールgauche.test: 例外をテストする方法が改善されました。 特定のコンディションタイプの例外が上がることを、期待される値に (test-error condition-type) を与えることで検査できます。より詳しくは マニュアルのエントリをどうぞ。
    • モジュールrfc.http: httpプロキシを:proxy キーワード引数で指定できるようになりました。 また、フォーム引数を送信するための application/x-www-form-urlencodedmultipart/form-data形式のメッセージを簡単に構築できるようになっています。 手続きhttp-puthttp-delete追加されました。
    • モジュールrfc.mime: MIMEメッセージ構築のための手続きが 追加されました。
    • モジュールgauche.threads: 新手続き thread-stop!thread-cont!thread-state
    • モジュールgauche.termios: Windowsネイティブ版では、 このモジュールはPOSIX termiosの代わりにWindows Console APIを 提供します。POSIX termiosをWindowsでエミュレートするのはとても面倒だからです。 どちらのプラットフォームでも共通して使える高レベル手続きも提供されます。
    • モジュールgauche.dictionaryに汎用的な双方向マップ <bimap>が追加されました。
    • gauche.processモジュールのrun-process、 および組み込みのsys-execsys-fork-and-execで、 :directoryキーワード引数によって 実行されるプロセスのワーキングディレクトリを指定できます。
    • モジュールfile.utilに新関数create-directory-treecheck-directory-treeが追加されました。
    • モジュールgauche.netに低レベルソケット操作関数 socket-sendmsgsocket-buildmsgsocket-ioctlが追加されました。また、 Call-with-client-socketがソケットポートのバッファリングモード を指定するキーワード引数を取れるようになっています。
    • モジュールwww.cgi: cgi-mainは標準エラー 出力のバッファリングモードをlineにセットします。 これによってhttpdのログが見やすくなるでしょう。
  • 重要な修正と改善
    • OSX 10.6 (Snow Leopard)上でのビルドが失敗していたのを修正。
    • 浮動小数点数演算、組み込み手続きのオプショナル引数の処理、 およびcase-lambdaの呼び出し処理性能が大幅に改善されています。
    • R6RSで空白と定義されている全ての文字がソースコード内で空白と 認識されるようになりました。例えば全角スペースも空白扱いです。
    • スレッドがエラーで終了し、他のスレッドにthread-join!される ことなくGCされた場合に警告を出すようになりました。これは問題解決に便利です。 スレッドがエラー終了したことを確認するには、他のスレッドが thread-join!を発行するしかありません。したがって、 スレッドプログラミングでは常に、thread-join!でチェックするか、 スレッドのthunk内でエラーを捕捉して適切な処理をするようにしてください。
    • 無名モジュールの名前は、以前はシンボル|#|でしたが #fに変更されました。「無名」なのでこちらの方がふさわしいでしょう。
    • シンボルの扱いの拡張: 「インターンされない (uninterned)」シンボルを 正式にサポートします (gensymで生成されたシンボルはこれまでも uninternedでしたが、はっきりドキュメントされていませんでした。) uninternedなシンボルはCommonLisp風に#:symbolと表記されます。 uninternedシンボルは、内部のシンボルテーブルに登録されないため、 名前がたまたま同じになっても実体が衝突する心配がありません。 同一のuninternedシンボルをソースの別々の箇所から参照する唯一の方法は srfi-38記法 (#n=#n#)を使うことです。 uninternedシンボルは string->uninterned-symbolで作ることができ、また シンボルがinternされているかどうかはsymbol-intened?で 調べられます。また、新しい手続きsymbol-sans-prefixが 追加されています。
  • Windowsサポート
    • Windows用のコンパイル済みバイナリインストーラが提供されます。 Gauche-mingw-0.9.exeをダウンロードしてください。 Windows NTアーキテクチャ上で動作します (Win9xはサポート外とさせてください)。
    • プリコンパイルバイナリには(今のところ)スレッドサポートとgdbmインタフェースは 含まれていません。utf-8エンコーディングでコンパイルされています。
    • Unix特有のシステム関数はサポートされないか、Windows APIでエミュレート するために多少違った動作をします。関数がWindowsでサポートされていない場合は リファレンスマニュアルにその旨示してあります。Windows版はまだあまり 使い込まれていないので、バグが結構残っているかもしれません。
    • Windows Console上でASCII以外の文字を使うのはかなり不便です。 インタラクティブな用途では、できるだけgoshをEmacsから使う ことをおすすめします。より詳しい情報は WindowsConsoleを 見てください。

2008/10/6

Gauche 0.8.14: メンテナンスリリース

  • バグフィクス
    • applyに渡した引数リストがコピーされないケースがありました。
    • いくつかのプラットフォームで、sigsetjmpの仕様の違いから 例外ハンドル後にスレッドのシグナルマスクが おかしくなるという現象がありました。
    • formatは、フォーマット文字列中に不正な'~'を含んでいる 場合にエラーを通知するようになりました。
    • パラメータ(gauche.parameter)処理の内部コードで、 アロケートするメモリ量が充分でない場合がありました。
    • dynamic-loadがデッドロックや内部状態をおかしくする バグを修正しました。
    • rfc.httpで、リダイレクト後に'host'フィールドがおかしくなる バグがありました。
  • R6RS風の拡張
    • R6RSにあるリーダディレクティブ #!r6rs#!fold-case#!no-fold-case が認識されるようになりました。 後者2つはソースコードの途中で大文字小文字を区別するかどうかをリーダが 切り替えることを可能にします。詳しくはマニュアルを参照のこと。
    • 追加されたコア手続き: finite?, infinite?, nan?, eof-object.
    • 2引数版の log: (log z b)b を底 としたzのlogarithmになります。
  • 拡張のビルドに関する改善
    • gauche-configスクリプトに--rpath-flag オプションが追加され、プラットフォーム特有のrpathリンクオプション (例:"-Wl,--rpath -Wl,") を取り出せます。
    • gauche-packageスクリプトの'compile'と'install' コマンドに--localオプションを与えることで、サイト固有の ローカルなインクルードパスやライブラリサーチパスを与えることが 容易になりました。 gauche-package compile --local=DIR package.tgz とすると、オプション-IDIR/include-LDIR/lib がそれぞれコンパイル時とリンク時のオプションに追加されます。 二つ以上のディレクトリを与えるには--local=DIR1:DIR2:...と します。
    • スタブジェネレータとアヘッドオブタイムコンパイラ (Schemeコードを あらかじめVMインストラクションへとコンパイルし、Cの静的配列として 書き出す機能) が統合されました。これにより、CとSchemeを混在した コードを書くことができます。この機能はまだドキュメントされておらず、 細かい部分で仕様が変更されるかもしれませんが、好奇心が抑えられない方は ext/dbm/* などのソースを覗いてみてください。以前のリリースに比べ かなりシンプルになっています。
  • その他の改善、新しい手続きとマクロ
    • GCをBoehm GC 7.1にアップデートしました。
    • メンテナンスの容易さのためにVMの大部分を書き直しました。性能も若干 良くなっています。
    • 新しい手続き: hash-table-copy.
    • 新しいマクロ: rlet1if-let1.
    • パラメータexit-handlerによってexitの 動作をフックできるようになりました。マニュアルの「プログラムの終了」 の節を参照してください。
    • Windows上でもsys-lstatを使えるようにしました。 単にsys-statと同様に動作するというだけですが、クロスプラットフォームな コードを書くのが楽になります。
    • モジュールgauche.net: socket-shutdownの 引数に使える定数 SHUT_RD, SHUT_WR, SHUT_RDWRを定義しました。
    • モジュールfile.util: 新しい便利な手続き: copy-directory*, touch-files, remove-files, delete-files.
    • モジュールdbm.*: 一貫性のため、dbm-renamedbm-moveに改名しました (互換性のために旧名もエイリアスとして 残されます)。dbm.fsdbmに欠けていたdbm-copydbm-moveを実装しました。また、ndbm互換ライブラリ のデータベースのサフィックスがライブラリによって異なるのを configure時に判定するようにしました。
    • モジュールwww.cgi: get-mime-partsのMIMEパートハンドラに :modeオプションを追加し、セーブされるファイルの パーミッションを指定できるようになりました。
    • モジュールrfc.ip: 手続きの追加: ipv4-global-address?.

2008/2/13

Gauche 0.8.13: Lots of small improvements

  • Bug fixes
    • Module rfc.http: fixed a bug that didn't pass the port number in the host header field.
    • rxmatch-num-matches: returns 0 if #f is given, as described in the manual.
    • asin, asinh: fixed a problem of the code to avoid numerical instability.
    • Module slib: fixed to work with the newest slib release.
    • Module gauche.process: on-error-exit handler was errneously called even when the process' exit status was zero.
    • Module file.util: Fixed a bug in copy-file that didn't preserve the mode of the desination file in certain cases.
    • Module gauche.parseopt: Fixed a problem that regexp ran out of stack when very long option argument was given.
    • Fixed a problem of make uninstall that might remove libgc.a which wasn't installed by Gauche.
    • Module gauche.test: test-module have missed to check some of the internal definitions. Now it is fixed, and it may find references to undefined variables that haven't been spotted before.
    • Fixed an autoload bug which caused malfunction when mulitple threads tried to resolve the same autoload simultaneously.
  • Improvements in the core
    • Improved argument handling in apply: It used to push each arument in the argument list onto the VM stack, so when you applied long argument list that wouldn't fit the VM stack it failed. Now apply only expands the argument list as much as it needs. This eliminates the limitation of the length of argument list in almost all cases. For example, you can now do this:
        (apply list (iota 50000)) 
    • Better support of cross compilation (patch from YOKOTA Hiroshi).
    • New procedures: fixnum-width, greatest-fixnum, least-fixnum (as defined in R6RS).
    • String literals allow R6RS-style line breaking---a sequence of a backslash, zero or more whitespaces, newline, and zero or more whitespaces, are ignored in a string literal. You can write
       "Suppose this is very very long line." 
      as
       "Suppose this is very \ 
        very long line."
      for example.
  • Improvements in the system interface
    • Now Gauche uses 64bit file offsets, enabling to handle >2GB files. (On Linux, including <gauche.h> defines _FILE_OFFSET_BITS to 64. If you link libgauche with other libraries and passes around file offset value or struct stat, make sure the other libraries are also compiled with the same _FILE_OFFSET_BITS).
    • glob and glob-fold now supports '**' wildcard that matches multiple levels of directories.
    • New system functions: sys-getrlimit and sys-setrlimit.
    • <time> can now represent a time after the year 2038.
    • The default buffering mode of stdout is changed to full when it is not connected to the terminal (it remains line if it outputs to the terminal). This improves output performance quite a bit when you redirect the large output to a file or a pipe. Note: This may break programs that forgot to call (flush) when the output is piped.
  • Improvements in regexp
    • Regexp has now read/write invariance, except when it is created by string->regexp from a string with weird characters.
    • New procedure: rxmatch->string.
    • In regexp-replace family functions, you can now use names of named capturing groups to refer to the captured substring, as well as their indexes.
  • Improvements in other libraries
    • Module rfc.base64 and rfc.quoted-printable: The encoding routines now takes :line-width keyword arguments to insert line breaks in the output.
    • Module rfc.822: Added rfc822-write-headers, a generic message header generation routine. For the symmetry with it, rfc822-header->list is renamed to rfc822-read-headers. The old name is kept for the compatibility.
    • New tree-map search functions: tree-map-floor, tree-map-floor-key, tree-map-floor-value, tree-map-ceiling, tree-map-ceiling-key, tree-map-ceiling-value, tree-map-predecessor, tree-map-predecessor-key, tree-map-predecessor-value, tree-map-successor, tree-map-successor-key, tree-map-successor-value.
    • Module srfi-19: Julian day and modified julian day are now calculated by exact integers, avoiding rounding errors.
    • Module gauche.sequence: Officially supports methods to shuffle and permute the sequence content: permute, permute!, permute-to, shuffle, shuffle!, shuffle-to. These are already in since 0.8.12, but weren't documented.

古いニュース

Stay Informed

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

Acknowledgments

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

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