コンテンツにスキップ

すべての構文はファーストラムダである

提供: ウィキバーシティ


序論

[編集]

本稿では、制御構造・スコープ・クロージャという言語要素を、共通の原理に基づいて再構成する。キーとなるのは "ファーストラムダ最適化"(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構文系における記述力と最適性を両立するための核心原理である。