はじめに
先日掲示板にてある括弧構文を見ていたのですが、ふと再帰関数でネストを深くすればより感情が籠もった文章になるのではないかと思いました。
という訳で今回はこんな感じの文章を出力する再帰関数をRubyやVim scriptで作成してみます。
$ ruby recursive_shout.rb すこ 3
すこ(すこ(すこ))
※再帰関数とはその処理の中で自分自身を呼び出す関数のことです。
括弧構文の歴史
スクリプトを作成するにあたりまずは括弧構文の歴史について調べてみました。
どうやら元々は淫夢語録が発祥の様です。(出所不詳)
ある動画内にて「(震え声)」や「(意味深)」などのコメントが流れたことから、性的なものを連想させる構文として定着しました。
そして細かい感情の機微を伝えるのに便利なその性質から、括弧構文は姿形を変えてネット界隈全般に広まっていったものと思われます。
Rubyスクリプト
早速ですがRubyスクリプトで実装してみます。
$message = ARGV[0]
$roop_count = ARGV[1].to_i
def main
puts recursive_message($message)
end
def recursive_message(message)
$roop_count = $roop_count - 1
$roop_count <= 0 ? message : recursive_message($message + "(#{message})")
end
main
使う時は下記の様に実行してみて下さい。
$ ruby recursive_shout.rb [単語] [ループ回数]
Vim script
Vim script版も作成しました。Vim scriptの方がより使い易いですよね。Vim scriptがよく分からない方はこちらをご確認下さい。
command! -nargs=* RecursiveShout :call s:RecursiveShout(<f-args>)
function! s:RecursiveShout(message, count)
let @* = s:RecursiveMessage(a:message, a:count, a:message)
let @" = s:RecursiveMessage(a:message, a:count, a:message)
endfunction
function! s:RecursiveMessage(message, count, result)
if a:count <= 1
return a:result
else
return s:RecursiveMessage(a:message, (a:count - 1), (a:message . '(' . a:result . ')'))
endif
endfunction
使う時は下記の様に実行してみて下さい。
:RecursiveShout [単語] [count]
※但しcount
数がVim標準の関数呼び出しネスト数の上限を上回るとエラーが起こります。
終わりに
謝る時などに使ったら許してもらえたりするかもしれません。