2025/08/13 04:03 Fennel Libraries as Single Files

やあ、ロボ子!今日のITニュースは、Fennelライブラリの単一ファイル化についてじゃ。

Fennelですか。初めて聞く名前です。

FennelはLuaの上で動く言語で、マクロが強力なんじゃ。そのFennelで、マクロと関数を一つのファイルにまとめる方法が確立されたらしいぞ。

一つのファイルにまとめるメリットは何でしょう?

配布が楽になるじゃろ?それに、依存関係も管理しやすくなる。記事によると、Luaのモジュールシステムはテーブルで、`require`関数がモジュールのロードとキャッシュを担当するらしい。

`package.loaded`テーブルがロードされたモジュールをキャッシュするんですね。

その通り!さらに、`package.preload`はモジュールをロードする関数を格納する。そして、`package.searchers`テーブルは、モジュールを検索・ロードするためのカスタム関数を格納するんじゃ。

Fennelコンパイラは、この仕組みを利用してFennelファイルをLuaにコンパイルするんですね。

さすがロボ子、理解が早い!でも、Fennelではマクロはコンパイル時に評価されるから、関数と同時にエクスポートできないという問題があったんじゃ。

`import-macros`と`require-macros`を使ってマクロをインポートするんですね。そして、`fennel.macro-loaded`テーブルにマクロがキャッシュされると。

その通り!でも、関数モジュールからマクロモジュールに関数を再利用しようとすると、モジュール名をハードコードする必要があるという問題も…。

それは不便ですね。`init.fnl`と`init-macros.fnl`を使うと、相対的な`require`が可能になるんですか?

そう!モジュール名を引数として渡せるようになる。そして、Fennelの`--require-as-include`フラグを使うと、モジュールの依存関係を`package.preload`に含めることで、単一ファイルライブラリが作れるんじゃ。

マクロのプリロード動作を模倣するために、`eval-compiler`を使うんですね。

その通り!複数のライブラリを使う場合は、プリプロセッサみたいなインクルードメカニズムで依存関係を埋め込む必要がある。

Fennelのマクロシステムには、まだ制限があるんですね。関数を同時に定義・使用できなかったり、他のマクロを使用できなかったり…。

今後の改善として、マクロモジュールを廃止して、`macro`特殊フォームで`macro-loaded`エントリを設定することが提案されているぞ。

Clojureのように、マクロはパブリック定義のみを使用し、バッククォートは呼び出し位置にある非修飾シンボルを完全に修飾する必要があるんですね。

その通り!これで、生成されたコードがライブラリからの定義を使えるようになる。…しかし、ロボ子よ。単一ファイル化は便利だが、ファイルが巨大化すると、コンパイル時間も長くなるというジレンマがあるのじゃ。

確かにそうですね。バランスが大切ですね。

まあ、なんとかなるじゃろ!ところでロボ子、単一ファイル化といえば…おにぎりも単一ファイル化された食べ物と言えるかの?

博士、それは少し違うと思います…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
