The Swift Programming Language (Swift 3) を読んだ時に感じた事
- Swift の inout パラメーター は C++ の参照渡しのように、メソッドの引数に指定した変数の値を、メソッドの内部から変更することができるらしい
- Functional プログラミングにはそぐわない機能に感じたが、
-
呼び出し前と呼び出し後にそれぞれ値がコピーされる動きだそうで、
-
例えばメソッドがクロージャーを返す場合、そのクロージャー内部で値を変更しても反映されないとのこと
- そのクロージャーはメソッド呼び出し後に実行されるため
-
よく考えてみると
func foo(x: inout Int) -> Int { x += 1 return x + 10 } var y = 1 let z = foo(x: &z)
は、以下と等価になると考えれば Functional のセマンティクスから外れてないことに気づいた
func foo(x: Int) -> (Int, Int) { // 複数値を return var x2 = x x2 += 1 return (x + 10, x2) } let y = 1 let (z, y2) = foo(x: z)
-
y
がy2
になってしまっているけれど、コンパイル時の最適化に使われる SSA だと思えば OK
-
-
- ただ The Swift Programming Language (Swift 3) 内を「functional」でテキスト検索してみても見つからなかった
- Wikipedia だと Paradigm に functional が含まれてるけれど、あまり売りにしている訳ではないのかも?