第11回Vimスクリプト入門みたいの(リストソート用関数・変換用関数・関数呼出用関数)

ええと、うまく分割できなかったので、メモをほとんどそのままうp。昨日書いたロックマンは片付いたんで、次は課題図書です。Vimはその3つくらい後かな。優先順位が低いです。
あと、ええと、ブクマのコメ確認しました。genutilsやらtlibやらですね、見てみて「イケる!」と思ったら書きます。まだ、それが何なのかさえわかってないので、また何か書きます。

そろそろ、だれてきたので今回でリスト関係の関数はおしまい。まだDictionaryやらFuncrefやらの型が続くと思うとぞっとします。リストより前に文字列操作をやるべきだったんじゃと思ってます、はい。では以下コピペ。

" リストのソート用関数・変換用関数・関数呼出用関数
" sort(), reverse(), join(), split(), string(), repeat(), call()
"
" ソート用関数
" sort(), reverse()
"
" sort()

function! s:Compare(v1, v2)
  return ((a:v1 == a:v2) ? 0 : ((a:v1 > a:v2) ? 1 : -1))
endfunction
let a = ['a', 'B', 'c']
echo sort(copy(a))
let a = ['a', 'B', 'c']
echo sort(a, 1)
let a = [1, 3, 2]
echo sort(a, "<SID>Compare")

" 渡されたリストをソートし、そのリストを返す。
" 第2引数は1を渡せば、大文字小文字を区別しないソート。
" 関数名を文字列で渡せば、それを比較関数として解釈する。
" 比較関数についてはC言語のそれと同じ。
"
" reverse()

let a = range(1,5)
echo reverse(a)
let a = ['a', 'c', 'b']
echo reverse(a)

" 渡されたリストを逆順にし、そのリストを返す。
"
" sort(), reverse()は両方とも第1引数自体に変更をかけにいくので注意。
"
"

" 変換用関数
" join(), split(), string(), repeat()
"
" join()

let a = range(1, 5)
echo join(a)
echo join(a, "\n")

" リストの各要素を第2引数で区切った文字列を返す。
" ただ :echo としてもリストの出力はできるけど、
" 少し整形して出力したいときなどに使いやすい。
"
" split()

let s = 'a b c d'
let a = split(s)
echo a
let s = join(a, ',')
echo split(s, ',')
echo split(s,',\zs')

" 文字列を分割してリストを返す。要はjoin()の逆。
" 第2引数は区切り文字を表す正規表現。初期では空白。
" 例は書いていないが、最初や最後の要素が空文字になる場合は、
" 第3引数に1を指定しておかないと要素が削除されるらしい。
"
" string()

let a = range(1,5)
echo string(a)

" リストを:echoしたときと同じ形式の文字列を返す。evalで元に戻せる。
" リストに限った関数じゃないので、リストを操作する関数と言っていいのかな。
"
" repeat()

echo repeat('-', 8)
echo repeat(1, 8)
echo repeat(range(1,3), 2)

" リストの場合には第2引数回だけ連結したものが返る。
" あまり使い道はなさそう。数字のときは文字列として結合されるみたい。
"
" 関数呼出用関数
" call()
"
" call()

function! s:F1(...)
  return call('<SID>F2', a:000)
endfunction
function! s:F2(...)
  echo join(map(deepcopy(a:000), 'repeat("!", v:val)'), "\n")
endfunction
call call('<SID>F1', [3,4,5])

" 関数の呼び出しは :call だけでなく、この call() も使える。
" これを使えば、可変長引数を他の関数にそのまま渡すことができる。
" それをやりたいがために、リストについて調べはじめたわけだったりする。
"
" 回を経るごとにまとまりがなくなってて、すいません。
" ゆとりにはこれが精一杯。
"
" 今回のまとめ
" sort()
" reverse()
" join()
" split()
" string()
" repeat()
" call()
"
" 次回の予定
" DictionaryとFuncrefをこなしてもいいんだけど、
" 適当に既存のVimスクリプトを見て、よくわからなかった部分・調べた部分を
" 列挙する形で書いていくのがいいかも。未定ってことでよろしく。
"