Hatena::ブログ(Diary)

C++でゲームプログラミング

2012-06-22

[][]Vim の :command で再帰

まさに誰得


[ソース]

command! -nargs=+ Factorial 
\   execute [<f-args>][1] == 0
\       ? 'echo [ <f-args> ][0]'
\       : 'Factorial '.([<f-args>][0]*[<f-args>][1]).' '.([<f-args>][1]-1)

[コマンド]

:Factorial 1 4

[出力]

24

command だと値が返せない(返す方法が思いつかなかった)ので引数が2つになっています。

まぁこれは消せそうですが。

素直に関数書け、って気がするけど何かに使えるかしら。

2012-06-20

[][]quickrun.vimHaskell の簡易対話式インタプリタコマンドを定義する

Haskell で対話式インタプリタを使用する場合 ghci を使うのが便利なのですが、起動するのが手間なので quickrun.vim を使用して簡易的なコマンドを定義してみました。


[コード]

" 実行結果をバッファで開く
command! -nargs=1 QuickHaskell :execute ":QuickRun haskell -outputter buffer -src 'main = putStrLn $ show $ ".<f-args>."'"

" バッファではなくてコマンドラインに直接出力して欲しい場合はこちらを使用
" command_line {{{
let s:outputter = quickrun#outputter#buffered#new()
let s:outputter.name = "command_line"
let s:outputter.kind = "outputter"

function! s:outputter.finish(session)
    echo self._result
endfunction
call quickrun#module#register(s:outputter, 1)
unlet s:outputter
" }}}

" command! -nargs=1 QuickHaskell :execute ":QuickRun haskell -outputter command_line -src 'main = putStrLn $ show $ ".<f-args>."'"

[使い方]

:QuickHaskell map (3 +) [1..5]

[出力]

[4,5,6,7,8]

quickrun.vim ではコマンドの呼び出し時にソースコードを渡して実行する事が出来るのでそれを利用しています。

Haskell のコードは putStrLn で出力を行なっているだけなので ghci ほど使い勝手はよくないと思いますが、サッと使う分には便利かなーと。

コマンドライン関数名の補完とかも出来ればよさげ。


今回は Haskell を使用しましたが、別に Python だろうが Ruby だろうが C++ だろうが関係なく使用することが出来るので好きな言語で好きな風に定義すればいいと思います。

quickrun.vim 便利ですね。

2012-06-18

[]Vim script で変数を不変で定義するコマンド

前回の続き。

id:tyru さんに色々とコメントを頂いてこんな感じになりました。


[ソース]

command! -nargs=1 Val let <args> | :execute 'lockvar '.matchstr(<f-args>, '\zs.*\ze=')

Val value = 10
echo value

" 代入できないよ
let value = 10

" 再代入する場合は unlet か unlockvar
unlet value
" unlockvar value

Val value = 42
echo value

おお、だいぶ使い勝手がよくなった気がする!

command 便利。

ただ、上記の場合で一度定義した変数は再度定義する事が出来ないので、何回も読み込むような Vim script ファイルで使う場合はエラーが出るのでどうするか。

うーん、再変を許す :Reval とか定義したら不変の意味がなくなるからなぁ…。

うむむ…。


しかし、command はあまり活用していないので、こういうのは全然思いつかなかった。

色々と悪さが出きそうですね!

2012-06-16

[]Vim script で変数を不変にする

:lockvar コマンドを使用します。


[ソース]

let value = 42
lockvar value

let value = 10	" error

変数名を渡す事で、その変数が書き換えできないようにします。

便利な機能なのでいろんなところで使いたいんですけど :lockvar に変数を渡さないとダメなのがやや冗長。

こんな感じで変数定義と一緒に使いたいですね。


lockvar let value = 42

あと lockvar した変数は unlockvar で変更できるようにします。

2012-04-13

[]Vim script で文字列の足し込み

文字列の足し込みは += や -= のように .= という演算子が使えます。


[ソース]

let s:sum = ""
for var in range(5)
    let s:sum .= "homu"
endfor
echo s:sum

[出力]

homuhomuhomuhomuhomu

[注意]

この演算子は Vim 7.0 から実装されたらしいので、それ以下のバージョンで使用する可能性がある場合は注意して下さい。

関係無いですけど Vim で『この機能はバージョン○◯から使用することが出来ます』みたいなのを調べるにはどうすればいいんでしょうか。