MEP 10: whereの廃止
- Created: 2022-12-12 10:51:10
rsumのwhereはシンタックス的に特殊な割にはあまり使いみちが無かったし、ifelでも同じような事が出来る。 例えば以下のようなもの。
rsum(0:2*radius+1, 0:2*radius+1) |r_edgex, r_edgey|
where (r_edgex-radius)^2 + (r_edgey-radius)^2 <= radius^2 {
let sx = x+r_edgex-radius
let sy = y+r_edgey-radius
extendedExp(sx, sy)
}
これについて廃止を検討する。
まずifelで同じように書けるという所が廃止を検討したい所。 例えばさきほどの文は以下で同じ結果になる。
rsum(0:2*radius+1, 0:2*radius+1) |r_edgex, r_edgey| {
let sx = x+r_edgex-radius
let sy = y+r_edgey-radius
ifel((r_edgex-radius)^2 + (r_edgey-radius)^2 <= radius^2,
extendedExp(sx, sy),
[0.0, 0.0, 0.0, 0.0]
}
もともとはVMのfor文のオーバーヘッドの大きさから、中を見ずにスキップ出来る事にはパフォーマンス的に大きな改善があったが、GPGPUでは両者の速度は変わらないはず。
また、whereの方が読みやすいという事もない。むしろwhereは読みにくい。
廃止したいと思う理由に、シンタックス的な特殊さと、その割にご利益の少ない所がある。 新しいシンタックスを理解するのはユーザーには負担になるので、出来たらその負担の分だけのご利益が欲しい。 だがwhereはシンタックス的な特殊さの割には使いみちが少ない。 whereは読みやすさのためにカッコでくくっていないのだが、それがexprの終わりがどこなのか、特殊なルールになっている。 これは通常の関数コール的に解釈出来る他の部分と比べて特別になっている。
一方でifelは十分汎用的で理解も容易だ。これで同じ事が書けるならこれでいいのでは無いか。 概念的にもreduce系でaccmが-1でなければそれをreturn、という良くあるイディオムと同じような感覚なので、こちらの方が馴染みやすい。
whereの気に食わない所に、内部構造の特殊さもある。 FuncObjという広く使われるものに、Whereをぶらさげる口があるがrsumでしか使わない。 また、Lowerで使うUnlessCondSkipというものもある。 後者は他の使いみちもありそうではあるが、今の所使っていない。 YAGNI的にもひとまずなくすのがいいんじゃないか。