第8回Vimスクリプト入門みたいの(リスト情報取得関数)

結局一日一回更新でいっぱいいっぱい。もっとクオリティ下げて毎日やるべきか、それともこのクオリティ・間隔を維持すべきか。ある程度まとまった単位でないと書きにくい気はするんだけど、逆に読むときは短い方が読みやすそうなんだよね。

あと目標がほしいな。こういうスクリプトを作る!みたいの。じゃ、今回の分。

" リストの情報取得用関数
" range(), len(), empty(), get(), index(), match(), max(), min(), count()
"
" 今回はリストの情報を取得する関数。
" 情報取得から先に紹介するのは、おそらく副作用がないため。
"
" range()

echo range(4)
echo range(1, 4)

" いきなりだが、ちょっと主旨に反する関数。これはリストの情報取得が目的で
" はない。ただ、前回使ったようなfor用の添字リストを作ったり、ちょっとした
" 連番のリストを作るのに便利だし、これからのサンプルコードでもよく使うの
" で最初に書いておく。例にはないが、第3引数はstepを示す。
" 引数の個数によって、最大値を含むか含まないかが変化することに注意。
"
" len()

let a = range(1, 5)
echo len(a)
let a = range(1, 10)
echo len(a)

" リストの要素数を返す。前回使ったし、問題ないと思う。count()とは別物。
" 文字列や数値の場合は、バイト数を返すらしいが、その場合は strlen() を
" 使った方が目的がはっきりして良いと思う。
"
" empty()

let a = []
echo empty(a)
let a = [1]
echo empty(a)

" リストが空なら1,空でないなら0を返す。len() == 0 でも可能だが、
" こちらの方が高速になるらしい。知っていればお得という関数。
"
" get()

let a = range(5)
echo get(a, 2)
echo get(a, len(a), -1)

" 指定した位置の値を返す。a[]の形式だと、添字が範囲外だった場合に
" エラーとなるが、get()の場合は第3引数(指定しなければ0)が返される。
" 安全に取得したい場合に便利かもしれない。
"
" index()

let a = ['a', 'B', 'c', 'de']
echo index(a, 'b')
echo index(a, 'b', 0, 1)
echo index(a, 'de')

" 最初に発見した位置を返す。見つからなければ -1。
" 第3、第4引数で、検索開始位置と大・小文字の区別を指定できる。
"
" match()

let a = [1, 2, 3, 'abc', 'def']
echo match(a, '\d')
echo match(a, '\d', 2)
echo match(a, '\w\{3}')

" index()と似ているが、こちらは正規表現を使える。
" ignorecase に影響される。smartcase には影響されない。
" magic で, cpoptions は空らしい。こういう情報はきっちり
" 把握しておいた方が良さそう。
" 第3、第4引数で、検索開始位置と無視する個数を指定できる。
" 第4引数を使うと第3引数の解釈が変わったりして、ややこしいので
" できるかぎり使わない方向でいきたい。
"
" max(), min()

let a = range(1, 5)
echo max(a)
echo min(a)

" max() は数値で最大のものを min() は数値で最小のものを返す。
" 文字列の場合は自分の環境では0になっているが、
" エラーになると書かれているので、注意して使うべきだと思う。
"
" count()

let a = ['a', 'b', 'A', 'b']
echo count(a, 'a')
echo count(a, 'a', 1)
echo count(a, 'a', 1, 1)
echo count(a, 'b')

" 該当する個数を返す。len()と間違いそうになった。
" 第3、第4引数は例によって、大小の区別と開始位置。
" index() と似た感じで使うのかと思ったが、第3、第4引数が逆。
" これは危ないな。
" 
"
" というわけで、今回はリストの情報取得用関数を簡単に試した。
" 次回はリスト操作用の関数を試す。
"
" 今回のまとめ
" range()
" len()
" empty()
" get()
" index()
" match()
" max()
" min()
" count()
"