For Gauche 0.9.5


Next: , Previous: , Up: ライブラリモジュール - R7RS統合   [Contents][Index]

10.2 3つのimport形式

歴史的な事情から、Gaucheにはimport形式が3つあります。 もともとのGaucheのimport、R7RSのimport、 そしてハイブリッドのimportです。

通常、コードを読み書きしている時は、それが伝統的なGaucheコードかR7RSコードかは 明確ですし、またimportの使われ方はだいたい決まっているので、 現場で混乱が起きることはありません。ただ、コードの外でimportについて 話す場合は、どのimportのことかをはっきりさせるのが良いでしょう。

ハイブリッドのimportは前節で説明したuser#importです (二つの世界を往き来する参照)。 user#importは GaucheのimportとR7RSのimportの両方の文法を理解できるので、 実際に知る必要のあるのは最初の2つの形式です。

Gaucheのモジュールシステム設計はSTkを継承していて、 importは純粋に名前空間の操作として使われています。 つまり、既にメモリ上に存在するモジュールをインポートするということです。 そのモジュールが定義されているファイルを、(必要なら)ロードするという 操作は別のプリミティブrequireにより実現されます。 典型的には、ひとつのファイルがひとつのモジュールを定義していて、 そのモジュールを使うにはまずファイルをrequireし、 次にモジュールをimportするということになります (これはGaucheでは頻繁に出てくるので、useというマクロが定義されているくらいです)。 ファイルのロードとモジュールのインポートが分かれていることは、 たまに変わったハックが必要とされる時に役に立ちます。 Gaucheのimportについてはモジュールの使用を参照してください。

R7RSは実装に選択の余地を与えるため、モジュール(ライブラリ)とファイルの関係は 敢えて規定していません。R7RSのimportは、 必要ならば暗黙のうちに、透過的にファイルをロードすることが期待されています。 つまり、R7RSのimportはGaucheのuseと意味的に同じと考えられます。

ハイブリッドimportはSchemeスクリプトの最初にのみ現れて、 実行されるスクリプトが伝統的なGaucheコードであるかR7RSコードであるかを 判断します。詳細は二つの世界を往き来するを参照してください。

ではR7RSのimportを説明します:

Special Form: import import-spec …

[R7RS] import-specで指定されるライブラリをインポートします。 R7RSでいうライブラリは、Gaucheがモジュールと呼んできたものです。両者は同じものです。

R7RSライブラリの名前はシンボルか整数のリストで表されます。 例: (scheme base)(srfi 1)。 この名前は、ピリオドを挟んでシンボル名をつなげることで、Gaucheのモジュール名へと 変換されます。つまり、R7RSの(scheme base)はGaucheからはscheme.base モジュールとして扱えます。逆にGaucheのdata.queueモジュールは R7RSからは(data queue)ライブラリとして扱えます。 R7RSプログラムからこれら二つのライブラリを使うには、プログラムの最初に 次のように記します。

(import (scheme base) 
        (data queue))

これはGaucheでuseフォームを使うのと同じです。つまり、もし その名前を持つモジュールが現在のプロセス内に無ければまずファイルをロードし、 それからモジュールがexportしている束縛を現在のモジュールから見えるようにします。

(use scheme.base)
(use data.queue)

(勘の良い読者は、R7RSのライブラリがピリオドを中に含むシンボルを名前に使っていたら どうなるのか疑問に思ったことでしょう。正直なところ、まだどうするか決めていません。 多分、何らかのエスケープ機構を用意することになると思いますが、 今のところ、できる限りモジュール名にはアルファベット、数字、ハイフンだけを 使うようにしておいて下さい。)

R7RSのimportフォームは、 Gaucheのuseと同様、どのシンボルをimportするか/しないかを指定したり、 名前を変えてimportしたりプレフィクスを付加することができます。 R7RSのimportの正式な構文は次の通りです。

<import declaration> : (import <import-set> <import-set> ...)

<import-set> : <library-name>
  | (only <import-set> <identifier> <identifier> ...)
  | (except <import-set> <identifier> <identifier> ...)
  | (prefix <import-set> <identifier>)
  | (rename <import-set>
            (<identifier> <identifier>)
            (<identifier> <identifier>) ...)

<library-name> : (<identifier-or-base-10-integer>
                  <identifier-or-base-10-integer> ...)

Next: , Previous: , Up: ライブラリモジュール - R7RS統合   [Contents][Index]