map, fold, filter on Vim Script

Vim ScriptでmapとかしようとあがくVimmerたち
4
おしょー@実際モチベーションがない @manga_osyo

@Linda_pp let result = {} | call map(copy(list), "extend(result, v:val)") とかで…。

2012-11-15 09:43:56
ドッグ @Linda_pp

@manga_osyo なるほど.map とか filter で副作用使うのは抵抗ありますが,多分現状だとそれが一番良いですね…

2012-11-15 09:45:20
おしょー@実際モチベーションがない @manga_osyo

@Linda_pp コードが短い方がいい、というのであれば現状はこれが限界ですかねぇ。

2012-11-15 09:46:29
おしょー@実際モチベーションがない @manga_osyo

実速度的にはどっちがいいんだろうか>for 文と map

2012-11-15 09:48:54
おしょー@実際モチベーションがない @manga_osyo

get(keys(filter(copy(a:dict), "v:val ". op ." a:item")), 0, default) 初見でこれが何をやっているのかわかるのだろうか…。

2012-11-15 09:50:43
ドッグ @Linda_pp

@manga_osyo 短いほうが良いというか,ループは難しいのでなるべく避けたいのが本音ですね… うーむ.

2012-11-15 09:52:03
mattn @mattn_jp

@manga_osyo vimスクリプトは、構文解析が expr1 から expr7 というカテゴライズされた文脈解析を「動的に」行っていて、遅くなる原因は、vim script とC言語を行き来する回数に比例しますね。なのでmapでも式が多いと遅いし、forが速いケースもある。

2012-11-15 09:54:19
ドッグ @Linda_pp

Vim script のこと何も分かっていないので,感覚が分からない…

2012-11-15 09:55:30
mattn @mattn_jp

vim script が気持ち悪い理由の一つに式を動的に、行単位で解析しているので、if 0 の後 else を探す為に通らない部分のコードをガリガリ無効化しながらパースしている。これが遅い。

2012-11-15 09:59:43
mattn @mattn_jp

なので if else endif ではよく通る方を if true とした部分に書くと、幾分速くなる可能性がある。もちろん else がくるまでに return する。

2012-11-15 10:00:24
ドッグ @Linda_pp

@mattn_jp なんと,行単位だったんですか…

2012-11-15 10:00:27
mattn @mattn_jp

そういう点で if に対する else をインデントで探せる python が羨ましくもあり、「ぜ...ぜんぜん羨ましくないもんね!」って言いたくなる所でもある。

2012-11-15 10:13:34
ドッグ @Linda_pp

@nooyosh すみませんが,うちの犬は自宅内警備(=昼寝)に忙しくて…

2012-11-15 10:13:45
ドッグ @Linda_pp

考えれば考えるほど Vim script にコンパイルできる静的型付け言語があると良さそうに見えてみる.

2012-11-15 10:14:43
おしょー@実際モチベーションがない @manga_osyo

@mattn_jp call map(range(10), "echo v:val") 的な事がしたいです…。

2012-11-15 10:15:26
mattn @mattn_jp

@manga_osyo vim script では foldexpr の様にモードラインでコマンドを実行される危険性を器具して、あえて式以外を取らない方針だったと思います。ちなみに sandbox は後から出来たコマンドです。

2012-11-15 10:19:01