2014-03-04
■ [biwascheme] R7RS Libraryについての調査
メモです。ソースはr7rs.pdf (final draft)。
だいたいこんな感じか?
;; ライブラリ stack
(define-library (stack)
(export make-stack stack-push stack-pop)
(import (scheme base))
(begin
(define (make-stack n)
...
;; メイン
(import (scheme base) (stack))
(define s (make-stack 10))
...
-
ライブラリ名は(net http)みたいに階層化する
- (scheme ...)は言語により予約済
- (srfi ...)も予約済
-
ライブラリ定義に書けるもの:
- export : ここで指定した識別子がエクスポートされる
- (rename a b)を使うと内部と違う名前でエクスポートできる
- import : このライブラリが依存するライブラリを書く
- begin : ライブラリ本体を書く
- include, include-ci : ファイルをライブラリの本体部分に埋め込む
- include-library-declarations : ファイルをライブラリの宣言部分に埋め込む
- cond-expand : cond-expandした結果を、ライブラリの宣言部分に埋め込む
- export : ここで指定した識別子がエクスポートされる
-
実装例
-
- cond-expandを展開する
-
- このライブラリのための環境を用意する(importした束縛が含まれていること)
-
- すべてのbegin, include, include-ciを、それらが書かれた順にその環境内で展開する
- あるいは(この節、よく分からなかった)
-
-
ライブラリのロード
- 式を上から順に実行
- ロードのタイミング:programやlibrary bodyがライブラリの定義を参照している場合は、それらの評価前にライブラリをロードする
- あるライブラリが2回以上importされているとき、処理系は読み込みを2回以上行ってもよい*1
- これはsyntax定義についても同様
- ただし、例えばあるプログラムが(import (only (foo) a) (only (foo) b))と書いていた場合は、fooは1回だけ読み込むものとする
整理すると、あるライブラリが「2つ以上のprogram/libraryからimportされている」場合は2回以上読み込んでもよい。しかし「ある一つのprogram/libraryに2回以上importが書いてある場合」に関しては1回しか読み込んではいけない、ということか?わざわざ後者の注釈を付けたのは何故なんだろうなぁ(単純に速度の問題とか?)
ライブラリのimport (5.2)
programは1つ以上のインポート定義と、それに続くプログラム本体(式 or 定義 の列)からなる。 chibi-schemeで試してみたけど、確かに最初にimport書かないとエラーになった。あとchibiではライブラリは.sldという拡張子にするらしい。
(import (scheme base) (scheme write))
(display "Hello, world!") (newline)
-
(import xx)
- ライブラリ名 : ライブラリ全体を読み込む
- only : 特定の束縛のみ読み込む
- except : 特定の束縛以外を読み込む
- prefix : 束縛に自動でプレフィクスを付けて読み込む
- rename : 束縛のうちの特定の名前を置き換えつつ読み込む
-
名前が重複した場合はエラー
-
importした名前をdefineやset!で上書きしようとした場合はエラーになる
- ただしREPL内ではこれは許されるべき(should)
ファイルのinclude (4.1.7)
(include "xx" "yy")はファイル名を受け取り、それをその場に展開する (Rubyでいうload相当か)。
*1 のでライブラリのトップレベルに副作用のあるコードを書くときは注意、ということかな