ファーストラムダとインラインクロージャの本質と誤解
表示
YOYUにおけるファーストラムダは、従来の言語設計では関数と構文のあいだにあった境界を打ち破る発見である。
本項では、ファーストラムダとインラインクロージャの意味、そしてそれに対するよくある誤解を整理する。
ファーストラムダとは何か
[編集]ファーストラムダとは、以下のような構文形式:
((lambda (x y) body) arg1 arg2)
が登場したとき、それを評価系が自動的に以下のような インラインクロージャ として扱うという規則である:
(('inline-lambda env (x y) body) arg1 arg2)
この変換は、プログラマが明示的に `inline-lambda` を書かなくても、**構文上そのように最適化しても意味が破綻しない**ことが明らかな場合に行われる。
この処理は構文を評価器に変えるものであり、事実上、構文=関数 を成り立たせる基礎となる。
インラインクロージャとは何か
[編集]インラインクロージャ(`inline-lambda`)とは、評価器がその場で構文として展開し、意味を与えて良いとされる関数オブジェクトである。
('inline-lambda env (params...) body)
これは単なる「一回限りの使い捨て関数」ではない。以下のように使われる:
- シンボルにバインドできる:
(define my-if
('inline-lambda env (cond then else)
(if cond then else)))
- 引数として渡すことができる:
(use-as-control my-if expr1 expr2)
- 再帰的に呼び出してもよい:
(define repeat
('inline-lambda env (n f)
(if (= n 0)
'done
(begin (f) (repeat (- n 1) f)))))
よくある誤解とその訂正
[編集]誤解1:インラインクロージャは一度きりしか使えない
[編集]→ 誤り。インラインクロージャは第一級関数であり、再利用されてもよい。
誤解2:インラインクロージャは副作用を持つ関数には使えない
[編集]→ 誤り。評価のたびに展開されるため、むしろ副作用の制御がしやすい。
誤解3:インラインクロージャは最適化手段であり意味論的には lambda と等価
[編集]→ 誤り。inline-lambda は意味論的に「構文の一部」として設計されており、 構文木そのものが意味を持つように意図されている。
関数オブジェクトの3分類(YOYU流)
[編集]- lambda
通常のクロージャ。再利用可能な関数。
- inline-lambda
評価時に展開される構文的関数。
- ファーストラムダ
`(lambda ...)` 形式が `car` に来たとき、
暗黙に `'inline-lambda` に変換して良いという構文パターン。
構文と関数の統一
[編集]この設計により、YOYUでは:
- `if` や `cond` などの制御構造も通常の関数で書ける
- 構文に意味があり、`eval` が不要になる
- 関数適用(`apply`)だけですべての評価が完結する
- 構文の再帰的定義が可能になる(メタ構文)