鈴木うどんの横須賀おもしろ生活

撮った写真や思ったことや技術ネタなど。出来るだけ大きなディスプレイで見ると良いと思う。ここでの発言は個人の見解であり、所属する組織の公式見解ではありません。

会社の中心で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のキータイプを強化するのはうんざり!)