Gauche:FAQ
GaucheのFAQの叩き台、にしてみる。
- 一般的な質問
- コンパイル・インストールに関する質問
- 機能に関する質問
- 実装に関する質問
- Q. Schemeプログラムをコンパイルできますか
- Q. コンパイルした結果をファイルにダンプしておくことはできますか
- Q. I'm a big Scheme fan. I'd like to use it for sys-admin type functions. It is very powerful to be able to pass lambda-expressions to e.g. grep or find. There's a scheme shell that attempts to do this, based on Scheme 48. I'd like to be able to write web servers using scheme. MIT GNU/Scheme has several written in it (as well as a very nice XML library), and Gauche has its Wiki. The problem is that whenever someone wants to make a new Scheme tool, they write a new Scheme to go with it. As a result, none of these play nicely together. There's a dozen different miniture Scheme implementations, each of which does one or two things well, but none of which are useable as a full-fledged programming system. There are two major ones (MIT and PLT), but both have holes. Why gauche? Why write a Scheme from scratch, instead of taking PLT Scheme or MIT GNU/Scheme (the two major Scheme systems), and extending it to do what you need (this may already be above -- I can't read Japanese)?
一般的な質問
Q. Gaucheって何て読むの?
A. 「ゴーシュ」です。
Q. なんでGaucheって名前にしたの?
A. Shiroより
(2005/08/30 05:11:37 PDT) Gaucheの起源
某所でGaucheの名前の起源について質問という程じゃないけれど 話題になっていたので、一応記しておく。いくつかの要因がたまたま 重なってついた名前にすぎず、そんなにおおげさな起源があるわけではない。
- "The Right Thing"が極めて重視されるSchemeだが、日常の泥くさい仕事にも 使えるように不格好な拡張も入れるよ、という言い訳。gauche = awkward、 および droit <-> gauche から。
- 音楽関係のとあるアプリを書くことを考えていて、「セロ弾きのゴーシュ」からの 連想でGaucheという名前を考えた。そのアプリを書くために思い通りに 操れる言語が欲しくて、当時構想していたScheme処理系をそれに使おうと考えた。 いつの間にか処理系自体をそう呼ぶようになった。
- 思い立った時にコマンドラインからインタプリタをすぐに立ち上げられる ために、コマンド名は4文字にしたかった (2, 3文字だとあまり特徴が出せない、 5文字以上はタイプが面倒)。"gosh" は、-sh で終わるところがインタラクティブ シェルっぽい、右手と左手で交互にタイプできる、ということで候補にあがった。 これを使うためにはシステム名が'g'で始まることが望ましかった。 (でも 'o' の出どころは結局考え付かなかった)
Q. gosh の 'O' はどこからきたの?
A. Schemeプログラマの心の叫び: Gosh! This is so ugly. It should be so much cleaner if it were written in Scheme!
もしくは、顧客の驚き: Oh gosh, how could you implement it in such a short time?
Q. 世の中にはたくさんScheme処理系があるのに、何故また新たな処理系を作ったの?
- 日本語がちゃんと扱える処理系が欲しかったから。 特に、後付けのライブラリではなく、最初から多バイトを前提にした 処理系が欲しかった。
- 仕事でスクリプトを書いていると、「痒いところに手を届かせる」ために 実装レベルで色々追加機能が必要になることがある。 自分で書いてしまえばそのへんが楽。
- 楽しいから。
Q. Gaucheはどこで手に入りますか
A. Github から最新版の ソースがダウンロードできます。Project Webpage には更新情報、ドキュメントなどが置いてあります。
Q. たくさんバージョンがあるんですが、どれを使えば良いのでしょう
A. まだ開発途上なので、安定版と開発版の区別はありません。 初めてダウンロードして使ってみる場合は最新版を落して頂ければ良いでしょう。
Q. Gaucheのライセンスは?
A. いわゆるBSDライセンス(宣伝条項無し)です。ディストリビューションに 含まれるCOPYINGを参照して下さい。
Q. Gaucheのマニュアルはありますか
A. 完全ではありませんが、日本語と英語のリファレンスマニュアルがあります。 ソースの中にtexinfo形式のマニュアルが含まれているほか、 HTML形式のマニュアルをオンラインで見たり、ダウンロードすることができます。 http://practical-scheme.net/gauche/memo-j.html
Q. Gaucheに関するメイリングリストはありますか
A. はい。2つのリストがあります。次のURLから登録や過去ログの参照が出来ます。 今のところ、英語MLの流量は10通/月くらいです。日本語MLは出来たばかりです。
- http://lists.sourceforge.net/lists/listinfo/gauche-devel メインのリスト。英語。
- http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp 日本語処理に関する議論や、日本語でのQ&A。日本語可。
日本語MLも需要があったので作りました。 ただ、議論を英語と日本語で分断させたくないので、 日本語MLに入る方はできれば英語MLにも入って、話題を追うようにして 頂ければと思います。英語での投稿が苦手…という方は英語MLでの 議論に対するフォローを日本語MLに振って頂いて構いません。 適当なところでサマリを英語MLに投げる等でやってゆきたいと思います。
まあ、今のところそこまで議論が白熱することが無いので杞憂に過ぎないかも しれませんが。
Q. Gaucheを使っててバグを見つけたんですが
A. 素晴らしい。次のアクションのいずれかを取って頂けると助かります。
- gauche-devel MLにバグレポートorパッチを投げる
- Gauche:Bugs にバグレポートorパッチを書き込む
- 作者(shiro @ acm . org) にバグレポートorパッチを送る
Gaucheのバージョンとプラットフォーム、それからconfigurationのオプション (何かのオプションを使った場合:gauche-config --reconfigureで表示されます) を含めて下さい。
Q. Gaucheの開発を手伝いたいのですが
A. 素晴らしい。あなたのような人を待っています。 他のオープンソースプロジェクトと同様に、Gaucheでも動作報告、 バグレポートからコアな開発者まで広く参加者を募っています。
- 処理系内部をごりごりいじりたい、あるいは拡張モジュールをCで書きたい方: Gaucheの内部APIはまだ流動的な部分があるため、現段階では 作者と緊密に連係をとって開発を進められることが望ましいです。
- マニュアルの校正。リファレンスマニュアルは時間のある時に 書き散らしているだけなので、typoやミスがたくさんあります。 それらを見付けたら指摘して頂けるとありがたいです。
- 他のプラットフォームへのポーティング。
コンパイル・インストールに関する質問
Q. Gaucheはどういったプラットフォーム上で使えますか
A. UnixならだいたいOKだと思います。Boehm GCを使っているので、 Boehm GCが動作するプラットフォームであることが条件になりますが。 Windows 上でもごく一部の機能を除いて動作するようです。 作者が確認しているプラットフォームは http://practical-scheme.net/gauche/features-j.html#ports を 参照してください。
Q. rpmパッケージはありますか
A. SourceForgeから、source rpm及び 作者の環境(RedHat7.2, gcc 2.96, glibc 2.2.4/i686)で構築した binary rpmをダウンロードできます: http://sourceforge.net/project/showfiles.php?group_id=25227
また、他のいくつかのディストリビューションでもrpmを作って頂いているようです。
Q. configureにえらく時間がかかるんですが、何とかなりませんか。なんか同じようなテストを何度もしているように見えるんですけど。
A. configureに-C もしくは --config-cacheオプションをつけて起動すれば、 テスト結果をキャッシュするようになりかなり速くなります。 この場合、config.cacheというファイルがトップディレクトリに残りますが、 オプションやプラットフォームを変えて再びconfigureする場合は忘れずに 消すようにして下さい。
Q. スタティックリンクするにはどうすればいいですか
機能に関する質問
Q. SLIBは使えますか
A. Aubrey JafferさんのSLIBは、インストールされていればGaucheから (use slib) とするだけで使えます。もし「require.scm が見つからないよ」みたいなエラーが 出たら、Gaucheがインストール時にSLIBの位置を正しく見つけていないと思われます。 環境変数SCHEME_LIBRARY_PATHをSLIBがインストールされたディレクトリに指定して goshを起動してみてください。ちゃんと直すには、 Gaucheのシステムライブラリパス(コマンドラインで gauche-config --syslibdir とすると表示されます)の下にあるslib.scm を編集して、 library-vicinity 関数内に書かれたパス名をSLIBがインストールされたディレクトリに してください。
Q. INSTALL.eucjpの通りにconfigureしたのに、エラーによりSLIBが実行できないのですが。
A. SLIBを使おうとするとこんな感じのエラーが出てしまうことがあります。
*** ERROR: couldn't open output file: "/usr/share/gauche/0.5.5/lib/slibcat"
SLIBが動作するためには、requireするfeatureとそれが定義されているファイル名 とを結びつけるデータベースslibcatが構築されていて、Gaucheのデフォルト ライブラリディレクトリ (手続きgauche-library-directoryが返すディレクトリ) にセーブされている必要があります。
Gauche 0.5.3以降はmake install時にSLIBが見付けられればslibcatを 作成するようになっていますが、何らかの理由でその時点でslibcatが 作られなかった場合、SLIBは 最初にSLIBが使われる時に slibcatを 作成しようとします。ここでgauche-library-directoryが一般ユーザに 書き込み不可能になっていたりすると、上記のようなエラーが出ます。
解決法は、gauche-library-directoryに書き込みできる権限のある ユーザがgoshを走らせて、何らかのSLIBモジュールをrequireすることです。 例えば次のような式を評価すると良いでしょう。
(use slib) (require 'logical)
Q. 日本語は使えますか
A. 「日本語が使える」とひとくちに言ってもいろいろ意味があると思いますが、 Gaucheではネイティブでマルチバイト文字列を扱うことができます。 例えば次のような式が正しく動作します。
(string-ref "abcいろは" 4) => #\ろ (string-set! "abc" #\美 1) => "a美c"
Q. いわゆる全角空白を正規表現に含めたいのですが
A. 直接正規表現構文 #/.../ の中にマルチバイト文字を書く事ができます。 全角空白も例外ではありません。例えば、次の正規表現は ASCIIの空白文字と全角空白の並びにマッチします。 's'の後ろに全角空白があります。 (これで思う様に動かない場合、プログラムの文字エンコーディングと Gaucheの内部エンコーディングが同じになっているかどうか確認してください。)
#/[\s ]+/
ただ、こういう記述はソースを眺めるだけではわかりにくいし、 文字エンコーディングがGaucheの内部エンコーディングと異なっていると 問題を生じます。全角空白文字の存在を明示するには、例えば こんなふうに書くと良いでしょう。正規表現、文字列、文字リテラル 中に\uNNNNという形でUnicode文字が書けます。
#/[\s\u3000]+/
Q. PostgreSQLを使う方法がありますか
A. あります。 Gauche-dbd-pgをインストールしてください。
Q. MySQLを使う方法がありますか?
A. あります。 Gauche-dbd-mysqlをインストールしてください。
Q. エラー時のスタックトレースと、実際にエラーが起きている場所が違うようです。
A. ソースコードから考えるとあってしかるべきスタックフレームが表示されないことが良くあります。特に、エラーの原因になった関数の呼び出しやその直前いくつかの関数の呼び出しが欠けているように見えることがあります。これにはいくつか原因があります。
まず、Schemeでは末尾呼び出しが最適化されることに注意して下さい。 例えば次のように、 関数fが(非末尾位置から)関数gを呼び、関数gの末尾位置から関数hが呼ばれたと します。
(define (f args) ... (g args) ...)
(define (g args) (if (null? args) (h args) (i args)))
(define (h args) ....)
この時、関数hが呼ばれる前に、関数gのフレームは削除されます。 言い替えれば、hの呼び出しに関して新たな継続フレームは作成されず、 hはgの継続フレームをそのまま使います---つまり、hは終了後直接関数fの gの呼び出し直後にリターンします。 したがって、h内でエラーが起きた場合、 それはあたかも関数fから直接呼ばれたかのように表示されます。
さらに、Gaucheはプリミティブな関数(Cで定義されているもの)の 呼び出しに関していくつかの 最適化を行います。具体的には必要の無い場合にスタックフレームの作成を 省略したり、Gauche VMの持つインストラクションに直接展開したりします。 そのようにして呼び出されたプリミティブな関数の中でエラーが報告された場合、 エラーのスタックフレームの表示には直接の原因となったプリミティブな関数が 現れません。
末尾再帰の最適化は言語仕様なのでいかんともし難いのですが、 Gauche内部での最適化に関しては性能と引き替えにある程度デバッグのための 情報を残すようなオプションを付けることは可能かもしれません。 この問題が大きな障害となるようでしたら考えます。
Q. エラー時のスタックトレースが末尾再帰の最適化の影響を受けるというのはわかったのですが、それにしても全然関係ない情報が表示されてるみたいです。
A. Debian用など、いくつかのパッケージで、Gaucheに付属のGCではなく システムにインストールされているBoehm GCライブラリを使うように コンパイルされているものがあります。
GaucheはBoehm GCのコンパイル時にDONT_ADD_BYTE_AT_ENDというフラグが 設定されていることを前提にしているのですが、もしシステムのBoehm GCが そのフラグなしでコンパイルされていると、ガベージコレクションの際に ソースコード情報が壊れるという症状が出ます。
Gauche-0.6.8までは、コンパイルフラグの異なるGCを使うことによる 影響は、パフォーマンスの低下とソースコード情報の破壊くらいしかみられませんが、 今後のバージョンによってはGaucheの実行に深刻な影響を与える可能性も あるので、できればGauche付属のBoehm GCを使うようにコンパイルし直すか、 システムのGCをコンパイルし直してください。
実装に関する質問
Q. Schemeプログラムをコンパイルできますか
A. ネイティブコードに、という意味ではできません。但し、Gaucheはトップレベルの Scheme式を読むとそれを仮想マシン向けの内部表現にコンパイルしてから実行します。
Q. コンパイルした結果をファイルにダンプしておくことはできますか
A. 原則としてできません。そういう設計です。モジュールの更新が頻繁に行われる環境下で、 ソースバージョンとコンパイルされたバージョンの両方をきちんとメンテナンス するのは頭痛のタネだからです。但し、外部のSchemeファイルに依存しない 実行形式を作りたいという場合はあるので、内部表現をダンプして実行形式にリンク できるようなメカニズムを将来作るかもしれません。
Q. I'm a big Scheme fan. I'd like to use it for sys-admin type functions. It is very powerful to be able to pass lambda-expressions to e.g. grep or find. There's a scheme shell that attempts to do this, based on Scheme 48. I'd like to be able to write web servers using scheme. MIT GNU/Scheme has several written in it (as well as a very nice XML library), and Gauche has its Wiki. The problem is that whenever someone wants to make a new Scheme tool, they write a new Scheme to go with it. As a result, none of these play nicely together. There's a dozen different miniture Scheme implementations, each of which does one or two things well, but none of which are useable as a full-fledged programming system. There are two major ones (MIT and PLT), but both have holes. Why gauche? Why write a Scheme from scratch, instead of taking PLT Scheme or MIT GNU/Scheme (the two major Scheme systems), and extending it to do what you need (this may already be above -- I can't read Japanese)?
A. When I started writing Gauche at year 2000, what I wanted were a comperhensive large character set support and native preemptive threads; I couldn't find existing implementations that had both, and these two features were so fundamental that you would need to rewrite a lot to add them to an existing implementation (I tried.)
I also wanted to see if multibyte string, as opposed to wide-character array, could be a practical solution for daily scripting language, which would be difficult to implement on existing one if the maintainer wanted wide-character array approach. Furthermore, I didn't want to stick to Unicode---there were practical situations that I wanted to have native strings encoded in EUC-JP, for example. I didn't (and still don't) think I could persuade major Scheme implementators to support such niche features which require fundamental changes of their runtime.