><https://twitter.com/orange_in_spacehttps://pawoo.net/@orange_in_space
本来「副作用」という巨視的すぎる視点ではなく、コードの有無が開発者の意図した結果 (特に値) を変更するか、というもっと制限された視野で考えるべき事柄のような気はする
これにはまあ同意するけど、「計算機の状態の全てが、あるオブジェクトから観測可能なわけではない」という観点もあり、つまりたとえばデバッグプリントは確かに副作用を発生させるけど、これが本当にコード上で何らかの観測可能な影響を及ぼすのか
それは慣習に過ぎないのではという感想です (もっと言えば、状態を持つ/持たないは自明ではない (特にキャッシュとかがあると))
なんでそうなるかと言うと、(計算機の)状態が「必ず変化しない」procedureなんて、中の処理が実際には空っぽとかじゃなければありえないだろうし><
例えばfugaってprocedureとint piyo(int x);ってfunctionを持つhogeがあったとする><int a=hoge.piyo(x);hoge.fuga();int b=hoge.piyo(x);ってした時に、よりaとbという結果が異なる可能性が高くなるよね?><;より参照透過性(?)が危険にさらされる(?)場面である可能性が高くなると看做せる(?)というか・・・><(状態を持つのであれば保障は出来ないのは当然として><)
変更された結果返ってくる値が元の値のその後であるのか複製であるのか、これは単に (GC 付きの言語であれば) 元の値の参照が生存しているか否かの違い、所有権のその後の話であって、本質的に異なるものだと言えるのだろうか?
少なくともC# で、何らかの関数を実行した結果は、何らかの新たな物(結果なりリソースなり)か何らかの部分集合等であって、その名前の手続きを実行して変化した(=非破壊では無いという意味では破壊された)結果と解釈する事って少なくともオレンジは無いかも><;関数型とかあんまり好きじゃないけど、「破壊されたその物が返ってくる」ってその逆方向に突っ走りまくりな発想では?><;
で、Linqでそんな変な場面ってあるの?><;
Pascal一族も別にfunctionで副作用を起こさないなんて意味は持ってないかも>< そうじゃなく、procedureって必ず・・・副作用?><; なんていうの?><;参照透過性の崩壊?><; なんかそんな感じの関数型の言語が避けまくるような物を踏んづけてる場所だよって言う意味を結果的に持ってない?><;(そうじゃない場所では踏んで無いということではなく><;)
オレンジの説明が微妙におかしいのかもしれないけど、hogeに何も起きないhogeのprocedureってなに?><;
function と proceduce を使い分けるとき、 function が副作用を含まないという意味なのか何らかの値を返却するという意味なのかは人によって異なる
hoge.fuga();hoge.piyo();で、fuga();が本来void fuga();でPascalでprocedureとするものであるのであれば、それはhogeに「何らかの操作をする」であって、hogeを加工した複製(例えば集合であるhogeの部分集合を返す)みたいな意味は持たないよね?><そういう意味を持つのであればそれはprocedureになるはずは無く必ずfunctionになるんだから><
ていうか、説明正しいかわかんないけど、procedureである事=副作用がある?><そのオブジェクト等の状態が変化する(させる)(可能性がある)と言うことになるんじゃないの・・・?>< そこで無加工の集合を返す(?><)みたいな表現になるのはまずくない?><
Linqほとんどわからんだけど、Linqに手続きに相当するキーワード(?)ってあるの・・・?><
?><;
もしかして、hoge.fuga();hoge.piyo();をhoge.fuga().piyo();みたいに書きたいってこと?><;
というのも、たとえばfoo.set_bar(bar()).set_baz(baz());みたいな式を書いたとき、 bar() と baz() の評価順序って定められてない気がするんですが、どうでしたっけ
いやこれは危険じゃないですか
C# / Delphi人的にはそんな事して何がうれしいのかさっぱりわからない・・・><
Pascalがわりと『そのまんま書く』って文化なのも影響してそう?><
思考の /dev/null