For Gauche 0.9.5


Next: , Previous: , Up: 基本的な構文   [Contents][Index]

4.11 インクルード

Special Form: include filename …
Special Form: include-ci filename …

[R7RS] filename …で指定されるファイルをコンパイル時に読み、 その内容がbeginで囲まれてインクルードフォームの位置に替わりに 置かれているかのように解釈します。 includeフォームはファイルの内容をそのまま読みますが、 include-ciフォームは、あたかもファイル先頭に#!fold-caseが 指定されたかのように、シンボルの大文字小文字を区別しないモードで読みます (大文字小文字の区別参照)。

読み込まれるファイルに文字エンコーディングを指定するコメントがあればそれは そのファイルを読んでいる間有効になります(マルチバイトスクリプト参照)。

filenameが絶対パスならば、そのパスに正確に合致するファイルが探されます。 相対パスなら、まずincludeフォームが 置かれていたファイルからの相対で探され、見つからなければ *load-path*にあるディレクトリからの相対パスが順に試されます。

例: ファイルa.scmには次のコードが書かれているとします。

(define x 0)
(define y 1)

このファイルを別ソースファイルからインクルードすることができます:

(define (foo)
  (include "a.scm")
  (list x y))

この場合、元のソースファイルはあたかも次のように書かれていたかのように解釈されます。

(define (foo)
  (begin
   (define x 0)
   (define y 1))
  (list x y))

(註: バージョン0.9.4では、includeは渡されたパス名が ./../で始まっていた場合は特別な動作をしていました。 コンパイラのカレントディレクトリからの相対でファイルを探していたのです。 これは意図した動作というより、loadとファイル探索ルーチンを共有していた ために生じた仕様でした。しかしloadが常に実行時の動作であるのに対し、 includeでカレントディレクトリからの相対パスを考える意味はほとんどありません。 そこで0.9.5では仕様を変更しました。)

Gaucheには、他のファイルからソースを読んでくる方法がいくつかあります。 以下にインクルードとの比較を説明します。

require (useextendも内部でrequireを呼んでいます)
load

通常、他のファイルに書かれたソースファイルを取り込むのに適した方法は require (もしくはuseextend) です。 includeフォームは、requireでは実現が難しいトリックのために使います。 例えば、第三者がR5RS向けに書いたコードを、Gaucheのモジュールシステムでラップしたい場合、 includeを使う 次のような内容の小さなファイルをそのコードのファイルと同じディレクトリに置いておけば、 第三者のコードを一切変えることなく、(use third-party-module) で コードをロードできます。

(define-module third-party-module
  (export proc ...)
  (include "third-party-source.scm"))

Next: , Previous: , Up: 基本的な構文   [Contents][Index]