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

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

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

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

News

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

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.

2007/10/29

Gauche 0.8.12: Maintenance release

  • Bug fixes
    • Module gauche.net: Important: Socket port buffering mode was set incorrectly in the release 0.8.11, making network applications behave erroneously.
    • Numeric comparison routine could return incorrect result when comparing ratnums in special cases.
    • Module file.util: file->string etc. now handles :if-does-not-exist argument properly, and returns #f if the file doesn't exist and :if-does-not-exist #f is specified.
    • Regmatch objects had a bug that returns "" for failed submatch, which should be #f.
    • Module dbm.gdbm: gdbm-errno and GDBM_SYNCMODE weren't exported.
  • Other improvements
    • The `glob' functionality is reimplemented in Scheme instead of calling libc's glob so that we can have the consistent behavior across platforms. The sys-glob function is renamed to glob, with additional features (the old name is kept for the backward compatibility). See the reference manual for the details.
    • New system functions: sys-environ and sys-environ->alist, to get all environment variables.
    • Infinities and NaNs are now read and written as +inf.0, -inf.0 and +nan.0, following R6RS syntax. The old notations like #i+1/0 etc. are also recognized for the backward compatibility.
    • Module text.progress: Allow to change header string dynamically, and also added a miscellaneous information field.

2007/8/16

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

  • 重要な変更
    • If --enable-threads argument is not given to the configure script, pthreads is automatically enabled when it is available on the platform. So you don't usually need to specify that option anymore. If you want to disable pthreads support explicitly, specify --enable-threads=none.
  • Bug fixes
    • Fixed a long standing bug that the autoload wasn't resolved when define-method was evaluated on the autoloaded symbol.
    • gauche.uvector: write-block output extra octets when byte swapping was enabled.
    • srfi-13: string-upcase! etc. didn't work without giving all the arguments, including the ones that were supposed to be optional.
    • rfc.ftp: ftp-put-unique now returns two values, the server's response and the remote file name created by the action; without the remote file name, it was pretty much useless. Also call-with-ftp-connection was passing a wrong keyword argument to ftp-login.
    • rfc.http: Keyword arguments :sink and :flusher were ignored by http-get.
    • slib: force-output didn't work.
    • srfi-1: lset= didn't work if more than two lists were given.
    • Gauche was SEGVed when cond or case with a dotted list in their clauses were given.
    • Gauche was SEGVed when a circular structure was passed to error or errorf.
    • Gauche was SEGVed when it tried to coerce some rational numbers with huge denominator/numerator into flonum.
    • Gauche was SEGVed when non-string key was given to a string hash table.
    • Comparing a small rational number with a big denominator against fixnum yielded a wrong result.
    • Double flonum to half float conversion routine had a little error in LP64 machines.
    • Fixed a problem of "port table full" when too many ports were opened and closed in a short time span.
    • There was a possibility of precision loss in conversion of exact integer to flonum, due to double rounding.
    • When gosh was run with a script and an error occurred, stack trace wasn't shown.
    • String interpolation didn't recognize '[]' as '()'.
    • sys-realpath was unusable due to typo.
    • Fixed a compile problem on Solaris regarding sigwait() incompatibility.
  • New modules, procedures and macros:
    • New generic functions in gauche.collection: find-min, find-max, and find-min&max.
    • port-fd-dup!: An interface to the dup(2) system call.
    • hash-table-clear! added.
    • sys-umask can now be called without arguments to obtain the current umask settings without changing it.
  • Other changes:
    • Template Makefile for extensions now honors separate builddir.
    • gauche.test: test-end procedure now returns the number of failed tests.

古いニュース

Stay Informed

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

Acknowledgments

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

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