MEP 11: rsumの一般化
- Created: 2023-01-09 12:17:02
現状テンソルなどを指定しないループはrsumしか無いが、rsumは足すという特殊な操作である。 当然mulやORなども欲しい事があるが、現状はその書き方が無い。
汎用的なreduceとその周辺のシンタックスについて考える。
reduce<ts>.accumulate との類似性でいけば、reduce_accumulate的な名前のなにかがあれば良い。 rsumとの類似性で行くならraccmだろうか?
raccm(-2:5, init=1) |r, accm| { input(x+r, y) * accm }
他の言語なら単なるreduceと呼ばれる事が多い気がする。 例えばpython。 functools — Higher-order functions and operations on callable objects — Python 3.11.1 documentation
一貫性は犠牲になるが、他の言語との類似性を考えるならreduceでも良いかもしれない。
reduce(-2:5, init=1) |r, accm| { input(x+r, y) * accm }
ここだけを見るならこちらの方が自然だなぁ。
rsumは良く使うので特別に用意しても良いと思う。 rmulはまぁいらないかなぁ。reduceで自分で書け、で良い気がする。
どちらにせよこの辺はlowerでreduceに展開されるだろうから、resolveとかのパーサー周辺以外はあまり作業は無いので、必要だと思ってから足せば良い気もする。
あまり使わないと思えば、reduce_accumulateでいい気もしてきた。
やはりreduceでいい気がしてきた。
パースの都合でinitを先にする。現状rangeは特別扱いしているのでinitが先の方が都合が良いが、将来的にはexprとしてパース出来るようにしたい。 ブロック引数のaccmが後ろなのは違和感もあるが、trans.accumulateとの一貫性のためこうしておく。 ここは変なのでそのうち直したい。
reduce(init=1, -2:5) |r, accm| { input(x+r, y)*accm }