MFGドキュメント
Home
Getting Started
Reference
  • ja-JP
  • en-US
Home
Getting Started
Reference
  • ja-JP
  • en-US
  • MEP 10: whereの廃止

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的にもひとまずなくすのがいいんじゃないか。

最終更新: 2025/11/20 15:14
Contributors: Kazuma Arino