関数型言語的JavaScriptにトライ
Haskell本を読んで関数型言語の考え方がなんとなくわかってきたので、
JavaScriptでそれができないか試してみる。
まずは簡単な計算機。
<html> <head> <title>calc</title> <script type="text/javascript" src="prototype-1.4.0.js"></script> <script type="text/javascript"> //演算(項1、項2)を評価して項1、tに代入、次の演算をセット var calc = { '=' : function(a){ return function(b){ return a = b; }}, '+' : function(a){ return function(b){ return (a - 0) + (b - 0)}}, '-' : function(a){ return function(b){ return a - b; }}, '*' : function(a){ return function(b){ return a * b; }}, '/' : function(a){ return function(b){ return b == "0" ? 0 : a / b; }} }; // 数字押したとき。追記するか上書するか var set1 = function(a){$('t').value=a; num = set2 }; var set2 = function(a){$('t').value = $F('t').concat(a); }; var num = set1; var fnc = calc['+'](0); // 演算子押したとき。 function exec(s){ a = fnc($F('t') - 0); fnc = calc[s](a); $('t').value = a; num = set1; } </script> <style type="text/css"> @import url(calc.css); </style> </head> <body> <div id="div_root"> <input type="text" id="t" value="0" /> <div id="div_buttons"> <div id="div_numbers"> <input type="button" class="button" value="1" onclick="num(this.value)" /> <input type="button" class="button" value="2" onclick="num(this.value)" /> <input type="button" class="button" value="3" onclick="num(this.value)" /> <input type="button" class="button" value="4" onclick="num(this.value)" /> <input type="button" class="button" value="5" onclick="num(this.value)" /> <input type="button" class="button" value="6" onclick="num(this.value)" /> <input type="button" class="button" value="7" onclick="num(this.value)" /> <input type="button" class="button" value="8" onclick="num(this.value)" /> <input type="button" class="button" value="9" onclick="num(this.value)" /> <input type="button" class="button" value="0" onclick="num(this.value)" /> </div> <div id="div_actions"> <input type="button" class="button" value="+" onclick="exec(this.value);" /> <input type="button" class="button" value="-" onclick="exec(this.value);" /> <input type="button" class="button" value="*" onclick="exec(this.value);" /> <input type="button" class="button" value="/" onclick="exec(this.value);" /> <input type="button" class="button" value="=" onclick="exec(this.value);" /> </div> </div> </div> </body> </html>
とりあえず関数志向に近づけたかっただけなので可読性度外視。
演算子をキーにした連想配列がHaskellの引数マッチングぽくていいかなと思ったのだけどexec()は完全に手続き志向だし、コード全体に副作用が分散してていまいち。HaskellだったらIOモナドが分散させないだろうし、もうちょっと何とかならないものか。
まあ本日の余暇としてはこんなところで。