D言語のpurityについて

1
SKS rep @repeatedly

@9rnsr weaked purityって実は未だにpureとしてどこまでの動作を保証しているかよく分かってない.他の関数型のpurityのように処理のキャッシュは行われない?

2012-07-02 00:32:26
hara kenji @9rnsr

@repeatedly 今のDには3種類のpurityがある。1.Immutable Purity: 引数が不変な値なので同じ引数なら結果が常に同じになる。いわゆる関数型言語で値をキャッシュできるのはこのタイプ

2012-07-02 00:40:43
hara kenji @9rnsr

2. , Constant Purity: 引数がconstな値の場合。この場合引数はconstな値への参照を含むことがあるので、同じ値を引数に与えても他の場所からconst参照先を書き換えられた場合結果が変わる可能性がある。これは値キャッシュできない。

2012-07-02 00:43:01
hara kenji @9rnsr

3. Weak Purity。引数がmutableな値への参照を含む。この場合関数は引数の参照を通して関数外にある値を書き換えられる。mutableなメンバ関数は暗黙のthisを持ち、これを通してメンバにアクセスできるのでweak purityになる。

2012-07-02 00:44:40
hara kenji @9rnsr

どのpurityも、関数が引数と無関係な関数外の状態(グローバル変数など)にアクセスすることは禁止される。 英語だが最近Davidが書いた http://t.co/XQlmlVe9 が結構判りやすいと思う。

2012-07-02 00:46:06
hara kenji @9rnsr

これらのpurityは関数シグネチャからのみ判断可能になっている(関数本体で何をしているかは無関係)。たとえばint indexOf(const int[] arr, int i) pure; はconst int[]がconstant purityになる

2012-07-02 00:48:31
hara kenji @9rnsr

あ、すいません。用語を間違えました。×immutable purity ○strong purityでした。

2012-07-02 00:49:31
hara kenji @9rnsr

ただこのpurityの算出処理はdmdもまだ完全な実装ではないので、ちゃんと実装されればstrong purityと判断される(=memorize可能になる)関数も増えると思います。

2012-07-02 00:58:34
hara kenji @9rnsr

ちなみにこの辺がちゃんと実装されると、配列の組み込みプロパティdupとidupを1つにまとめることが可能になるはずです。詳しくは複雑なのでここでは述べませんが。

2012-07-02 00:59:46
SKS rep @repeatedly

@9rnsr D言語においてはそもそもimmutableオブジェクト以外のメンバ関数の結果をmemoizeするのが間違いか…

2012-07-02 00:50:10
SKS rep @repeatedly

pureがあるとmemoizeしたくなるんだけどなぁ.weakly pureは便利だけど,それだけだと効率性にはあんまり寄与しないのが厳しい

2012-07-02 00:52:21
hara kenji @9rnsr

そうですね。constな値は「他の処理によって書き換わる可能性がある」という時点でmutableだと扱うべきです。RT @repeatedly: @9rnsr D言語においてはそもそもimmutableオブジェクト以外のメンバ関数の結果をmemoizeするのが間違いか…

2012-07-02 00:53:21