オブジェクト指向

vimスクリプトでプロトタイプベースの書き方が出来たとは。
試しに今回は複素数オブジェクトを作ってみる。

let Complex={}

function Complex.new(r,i) dict
  let obj=copy(self)
  let obj.real=a:r
  let obj.img=a:i
  return obj
endfunction

function Complex.add(other) dict
  let obj=copy(self)
  let obj.real=self.real+a:other.real
  let obj.img=self.img+a:other.img
  return obj
endfunction

function Complex.to_s() dict
  return (self.real).'+'.(self.img).'i'
endfunction

以上をcomplex.vimに保存して、以下のコマンドを順に実行。

:so complex.vim
:let a=Complex.new(1,2)
:let b=Complex.new(3,4)
:echo a.add(b).to_s()

すると、4+6iが表示される。

スクリプト版FizzBuzz

ドキュメントを見ていたらmapとかrangeとかが使えるのがわかったのでちょっと練習にFizzBuzzを書いてみた。

バッファに出力版

:call append(0,map(range(1,100),'!(v:val%15)?"FizzBuzz":!(v:val%3)?"Fizz":!(v:val%5)?"Bazz":v:val'))

バッファを汚さない版

:echo join(map(range(1,100),'!(v:val%15)?"FizzBuzz":!(v:val%3)?"Fizz":!(v:val%5)?"Bazz":v:val'),"\n")