トップ «前の日記(2014-02-26) 最新 次の日記(2014-03-25)» 編集

Route 477



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した結果を、ライブラリの宣言部分に埋め込む
  • 実装例

      1. cond-expandを展開する
      1. このライブラリのための環境を用意する(importした束縛が含まれていること)
      1. すべての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 のでライブラリのトップレベルに副作用のあるコードを書くときは注意、ということかな