インラインライブラリ
インラインライブラリの記法で悩む。"スクリプト中に別のライブラリを交ぜ書きする"方法。
moshの重要なミッションの一つに分散プログラムの記述が有る。現在moshは単一の名前空間を持つSchemeの伝統に則って"share nothingだけどシンボルの名前はスレッド間で共有"というデザインになっている。これは便利な場合も有るが、一般には、スレッドの独立性は高いことが期待されている。これに対応するためには、スレッド間で完全に独立した名前空間を提供するオプションが必要になる。これは、スレッドルーチンを独立したライブラリに置くことで達成できる。
R6RSのentry formatは、一つのプログラム/ライブラリ中に、名前空間が一つという状況を想定している。つまり、スレッドのために独立したライブラリを書くことを考えるなら次のようにしなければならない。
(ここでは、スレッドプログラムとその呼び出しを異なる言語/語彙で書くことを前提としている。OpenCLのようなヘテロジニアスコンピューティングを想定した言語への対応のため。)
(library (mythreadprog) ; R5RS言語によるスレッドルーチン (export entrypoint) (import (r5rs)) (define (entrypoint) (display "hello!"))) (import (nmosh)) ; nmosh言語によるメインプログラム (let ((tid (library-spawn! (mythreadprog) 'entrypoint))) ...)
これでは、スレッドとその呼び出しが物理的に離れた位置に書かれることになる。
(import (nmosh)) (let ((tid (library-spawn! (% (inline-library (export entrypoint) (import (r5rs)) ...))))) ...)
単純に記述をインライン化しようとすると、非常に冗長になってしまう。
いくつかのimportを纏めて取り扱うことのできる、import-setの概念を提供することを考えている。
(import (nmosh) (import-set %thread1 (r5rs))) (let ((tid (library-spawn! (%thread1 (define (entrypoint) (display "hello!"))) 'entrypoint))) ...)
import-setとプログラム本体は離れてしまうが、"書かれたコードが依存するライブラリ"という意味では、呼び出し元の依存ライブラリと考えても良いように思える。