評価戦略
1 2 訳は、計算機プログラムの構造と解釈より
↑ CLU Reference Manual
↑ 値渡しと参照渡しの違いを理解する
↑ CLU Reference Manual (1974), p. 14-15.
部分適用はどちらかというとカリー化や第一級関数と関連する。複数の引数を取る関数において、一部の引数だけ適用された関数を得ることである。これに対して、すべての引数を適用することを完全適用と呼ぶ。 例として、Haskellのような関数型言語で、与えられた数値を2倍する関数を部分適用で作ると
となる。部分適用されているのはtwiceを定義している'multiply x 2'の部分である。multiply関数は本来なら
のようにして使用するものであるが、これに2だけ適用して新たな関数twiceを得るのが部分適用である。 部分適用の重要性はモジュール性を高めることである。奇数・偶数の判定といった単純なものから、高階関数を駆使した複雑なものまで作り出すことができる。とくに遅延評価の言語で利用するとその効果は大きい。一方で、関数に副作用があると、思いもよらない結果をもたらすかもしれない。
必要呼び(call by need、必要渡し pass by need)とは名前呼びをメモ化したようなもので、関数の引数が評価されると、その値がそれ以降の利用のために代替として格納される。副作用がない場合、これは名前呼びと同じ結果となる。引数が何度も使われている場合、(更新に要するコストの合計が毎回計算するコストの合計より小さければ)必要呼びの方が性能がよい。
遅延評価を引数の評価戦略として見た場合は必要呼びである、と言える。
必要呼びの言語としてはHaskellが有名である。
参照の値渡し (共有呼び: call by sharing、オブジェクト呼び: call by object、call by object-sharing) は Barbara Liskov 他によって1974年にCLU言語で最初に call by sharing と呼ばれた評価戦略である。 日本語では参照の値渡しとも呼ばれる。Python、Iota、Java、Ruby、JavaScript、Scheme、OCaml、AppleScript等の多数の言語で使われている。しかしながら「参照の値渡し」という用語は一般的では無く、異なる情報源間で用語の混乱が見られる。例えば、Javaの分野ではJavaは全て値渡しであると言われている。参照の値渡しは、言語上の値がプリミティブ型ではなくオブジェクトに基づいているということ、つまり全ての値が「ボックス化」されていることを意味している。
参照の値渡しの意味論は参照渡しとは異なる: "In particular it is not call by value because mutations of arguments performed by the called routine will be visible to the caller.