PHP
PHPで関数をカリー化してみる
関数をカリー化するには、その言語が第一級関数をサポートしている必要がある。
要するに「関数を返す関数」が作成できることが前提となり、その返される関数がクロージャになっているか、その関数にキャプチャ機能があるか、どちらかが必要だ。
PHPの無名関数はClosureクラスのインスタンスだ。
名前からしてクロージャなので、当然関数のカリー化が可能だ。
ここでは引数を2つ取り、その和を返す下のような単純な関数をカリー化してみることにする。
上の関数をカリー化すると、下の「add_n_func」のような感じになる。
気をつけないといけないのが、JavaScriptと違って無名関数を定義するときに外側関数の引数 $x をuseしないとうまく動いてくれない点だ。
これはPHPが変数の宣言子を持っていない(使い始めたところで宣言されたものとして扱う)ためだと思われる。
PHPのインタプリタは、$xが「無名関数内で使い始めたローカル変数」なのか、「外側関数のローカル変数へのアクセス」なのかを区別できないので、プログラマーがインタプリタに対してそれを伝える必要がある。
なのでPHPの use は、C++のラムダ式でいう [=] や [&] (キャプチャ)とは違うようだ。(そもそもクロージャならキャプチャ機能はいらない)
普通の関数からグローバル変数にアクセスすための global 命令のようなものだろうと思う。
useには値渡しと参照渡しがあるが、参照渡しのほうがJavaScriptのクロージャの感覚に近い。(カリー化するときはどちらでも同じ挙動になる)
|