第10回Vimスクリプト入門みたいの(リスト削除関数)

今日は手抜き。ちょいと読書やらロックマンやらで忙しい。

" リストの削除用関数
" remove(), filter(), map()
"
" リストの削除用関数といいつつもmap()は明らかに違う。
" filter()と似ているので、一緒に書くことにした。
" 今日は忙しいのでひかえめな分量。
"
" remove()

let a = range(1,5)
echo remove(a, 1)
echo a
let a = range(1,5)
echo remove(a, 1, 3)
echo a

" 指定した要素を削除し、削除した値を返す。
" 第2引数に削除開始位置、第3引数に削除終了位置を指定する。
" 返されるのは削除後のリストではなく削除した値であることに注意する。
" ちなみにdelete()とは別物。
"
" filter()

function! s:FilterFunc(v)
  return ((a:v % 2 == 1) ? 1 : 0)
endfunction
let a = range(1,5)
call filter(a, 'v:val % 2 == 0')
echo a
let a = range(1,5)
echo filter(deepcopy(a), '<SID>FilterFunc(v:val)')
echo filter(a, 0)

" すべての要素を順に評価して式が真になる要素のみを残し、
" 削除後のリストを返す。要は名前の通りフィルタ。
" 第1引数自体に変更をかけにいく。
" 式(第2引数)は、簡単な式でもいいし、関数呼び出しでもいい。
" v:valが各要素になる。
" すべての要素で偽になる(第2引数に0)ようにすると、
" すべての要素が削除される。
"
" map()

function! s:MapFunc(v)
  return nr2char(char2nr('a') + a:v - 1)
endfunction
let a = range(1,5)
call map(a, 'v:val . ":"')
echo a
let a = range(1,5)
echo map(deepcopy(a), 'v:val * 20')
echo map(a, '<SID>MapFunc(v:val)')

" すべての要素を順に評価して式の値で要素を置換し、
" 置換後のリストを返す。
" 削除用の関数ではない、走査する際に便利な関数。
" filter()と同様に、第1引数を対象とし、第2引数に式をとる。
" v:valが値として渡される。
" サンプルに使っている nr2char()は文字コード→文字の変換、
" char2nr()は文字→文字コードの変換を行う関数。
" ASCIIに互換性のある文字コードを使っていれば1=>'a',2=>'b'...
" となるように関数を組んだつもり。
"
" 今回のまとめ
"  ( 下2つはリスト関係の関数じゃないよ! )
" remove()
" filter()
" map()
" nr2char()
" char2nr()
"
" 次回予告
" たぶんリストのソートとか
"