会社の中心でhogeeeeと叫ぶ:あるいはfunctionキータイプの強化
会社でつらくなることは会社員ならば誰しも経験があるだろう。つらくなったときは社内IRCの#hogeeeeでhoge(e+)と叫ぶといくらか気分が晴れやかになる。しかしながら、いちいちhoge(e+)とタイプするのは大変な手間であるし腱鞘炎のリスクともなりうる。そこで、スクリプトを用いた自動生成を試みることにした。一般的な会社員なら誰だってやることだろう。
ruby で自動生成する
rubyはかわいい。
puts 'hoge'+(e=->(v){rand>0.95?v:e[v]+'e'})['e']
どうしても再帰で書きたかったのだ。
記号的解説
->(v){v+v}
は lambda{|v| v+v}
と同じ。e['e']
は e.call 'e'
と同じ。ruby 1.9から使える。つまり↓と同じ。
puts 'hoge'+ (e = lambda {|v| rand > 0.95 ? v : e.call(v) + 'e' }).call('e')
この記法は可読性が著しく低下するので、short coding 用に追加されたとしか思えない。 ともかくとしてrubyはかわいいなあ。
JavaScriptでも書いてみよう
我々はfunction
と記述することを強いられている。
console.log('hoge'+function e(v){return Math.random()>0.95?v:e(v)+'e'}('e'));
一見良さそうであるが、Javascript はスコープが関数スコープだけであるため、これではグローバル変数e
が定義されてしまってとてもf*ckである。
console.log('hoge'+function(){return function e(v){return Math.random()>0.95?v:e(v)+'e'}('e')}());
関数スコープを作った。しかし、スコープを作るためだけに無駄な関数呼び出しが発生していて台無し感がある。ともかくとして、function
のキータイプを強化したいならJavaScriptはオススメではあると結論づけられよう。
しかし、本当にこれ現実解なのであろうか。これでは人類全体のfunction
のキータイプが強化されるばかりではなく、腱鞘炎患者の数が増大してしまう恐れがある。腱鞘炎患者に対してつぎ込まれる医療費を鑑みるに由々しき事態であろう。そこで、他の方法を考える。
console.log('hoge'+function(v){return Math.random()>0.95?v:arguments.callee(v)+'e'}('e'));
arguments
オブジェクトにはcallee
プロパティが存在しいるのでこれを使うこともできて一見有効な方法であるように感じられる。しかしarguments.callee
を用いると関数自身と自身の呼び出し元の双方が明らかにならないのでインライン展開の対象になる事ができない。つまり、インライン展開による性能向上の機会を失くす事となり、パフォーマンスにかなりの影響が現れると考えられる。結果的にarguments.callee
は通常では用いるケースが存在しないと判明した。つまりこの手法は覚えておいてもこういう場でいちびるくらいにしか役に立たない。まったくしょんぼりだ。しかも ECMA Script 5 では arguments.callee
は非推奨であるため、 strict mode では TypeError
が返る。ますます意味が無い。忘れて欲しい。
結論
ブロックスコープ欲しい。(function
のキータイプを強化するのはうんざり!)