すべての構文はファーストラムダである
序論
[編集]本稿では、制御構造・スコープ・クロージャという言語要素を、共通の原理に基づいて再構成する。キーとなるのは "ファーストラムダ最適化"(First Lambda Optimization)である。これは、即座に適用されるラムダ式に対して、クロージャを生成せずにスタティックスコープとして展開する手法である。この観点から、`if` も `let` も `while` も、すべて "ラムダの定義と即時適用" であることが明らかになる。
let の展開と意味
[編集]Scheme における let は糖衣構文に過ぎず、以下のように変換される:
(let ((x 1) (y 2))
(+ x y))
;; → 展開後
((lambda (x y) (+ x y)) 1 2)
このラムダ式は即座に適用されるため、クロージャ化する必要はなく、変数束縛もローカルブロックと同様に扱える。
制御構造の再解釈
[編集]多くの制御構造も同様に、条件に応じてラムダを選び即時適用する形式で記述できる:
(if c
(lambda () t)
(lambda () f))
これをファーストラムダとして最適化すれば、条件に応じたブロックがスタックフレーム上で直接実行され、if 文に相当するコードが得られる。
ファーストラムダ最適化の定義
[編集]次の条件を満たすラムダ式は、ファーストラムダとして最適化される:
- 定義後すぐに適用される(即時適用)
- 関数値として他の関数に渡されない
- クロージャとしての再利用を必要としない
この条件を満たす限り、ラムダ式はクロージャ化されずに静的なブロック構文として展開可能である。
Cとの一致
[編集]Cにおけるローカル変数ブロック:
int main() {
int x = 1;
int y = 2;
return x + y;
}
これは Scheme で言えば、次のラムダ式と等価である:
((lambda (x y) (+ x y)) 1 2)
この一致は、ラムダ式のファーストラムダ最適化によって実現される。
YOYU構文系における応用
[編集]YOYUでは、ファーストラムダ最適化を基本原則とし、すべての構文要素(if, let, while, caseなど)をマクロによってラムダ式に変換する。中間表現は `call`, `jump`, `return` に基づき、ローカル変数は静的スコープにより解決される。
この方式により、マクロは高い柔軟性を持ちながらも、生成されるコードは極めて冗長がなく、スタックフレームに収まる最小限の命令列となる。
結論
[編集]構文とは、静的スコープ上に構築されたローカルブロック(ファーストラムダ)の展開である。クロージャはそれを後に持ち越す必要がある時に限って現れる。したがって、言語の制御構造・スコープ・関数定義の全ては、ファーストラムダ最適化によって統一的に記述できる。
> すべての構文はファーストラムダである。
このパラダイムは、YOYU構文系における記述力と最適性を両立するための核心原理である。