萌えハッカーニュースリーダー

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

出典: https://andreyor.st/posts/2023-08-27-fennel-libraries-as-single-files/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、それは少し違うと思います…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search