Lisp脳ãªFizzBuzzã‚’JavaScriptã§æ›¸ã„ã¦ã¿ãŸ
最近ã€JavaScriptã«æƒ¹ã‹ã‚Œã‚‹ç†ç”±ã¯ã€é–¢æ•°åž‹è¨€èªžã®ç‰¹å¾´ã‚’æŒã¤ã¨ã“ã‚ã«åŽŸå› ãŒã‚るよã†ãªæ°—ãŒã—ã¦ã„ã¾ã™ã€‚
Lispã‚’å¾—æ„ã¨ã—ã¦ã„る人ã¯ã€Lisp脳ãªã‚‹è€ƒãˆæ–¹ãŒã‚ã‚‹ã¨ã®ã“ã¨ã§ã™ã€‚
興味ã®æºæ³‰ã«å‡ºä¼šã†ãŸã‚ã«ã€Lisp脳を覗ã„ã¦ã¿ã‚ˆã†ã¨æ€ã„ã€ã‚’èªã¿ãªãŒã‚‰ã€JavaScriptã§Lisp脳ãªFizzBuzz*1を書ã„ã¦ã¿ã¾ã—ãŸã€‚
ãŠæ‰‹æœ¬
(for-each print (map (lambda (x) (cond ((= (modulo x 15) 0) "FizzBuzz") ((= (modulo x 5) 0) "Buzz") ((= (modulo x 3) 0) "Fizz") (else x))) (iota 100 1)))
ã“れをèªã‚€ã ã‘ã§ã¯ã€æ£ç›´ä½•ã‚’ã‚„ã£ã¦ã‚‹ã‹ã‚ã‹ã‚Šã¾ã›ã‚“。次ã«ã€è§£èª¬ã‚’èªã¿ãªãŒã‚‰æ›¸ã„ã¦ã¿ã¾ã™ã€‚
ã¾ãšã¯ãƒªã‚¹ãƒˆã‚’作る
「ã¨ã‚Šã‚ãˆãš1ã‹ã‚‰100ã¾ã§ã®ãƒªã‚¹ãƒˆã‚’作れã°è‰¯ã•ãã†ã ã€
Lisp脳ãªäººã¯ã€ãƒªã‚¹ãƒˆã‚’ä¸å¿ƒã«ãƒ—ãƒã‚°ãƒ©ãƒ を考ãˆã‚‹ã¿ãŸã„ã§ã™ã€‚ã¾ãšã€ã“ã®ç™ºæƒ³ãŒç§ã«ã¯ã‚ã‚Šã¾ã›ã‚“。
ã“れをJavaScriptã§æ›¸ã„ã¦ã¿ã¾ã™ã€‚JavaScriptã«iotaãªã‚“ã¦é–¢æ•°ã¯ãªã„ã®ã§ã€ç„¡å関数ã§ã€‚*2
(function(max, start) { var list = []; for (var i = start; i <= max; i++) { list.push(i); } return list; })(100, 1)
map関数ã§ãƒªã‚¹ãƒˆã‚’åŠ å·¥ã™ã‚‹
「mapを使ã£ã¦ã“ã®ãƒªã‚¹ãƒˆã‚’åŠ å·¥ã—ã¦ã€åˆ¥ã®ãƒªã‚¹ãƒˆã‚’è¿”ã›ã°ã„ã„ã˜ã‚ƒã‚“ã€
map関数もJavaScriptã«ãªã„ã®ã§ã€ç„¡å関数を使ã„ã¾ã™ã€‚
「ãã®è¦ç´ ã‚’ç½®ãæ›ãˆã¦ãŠã‘ã°ã€å‡ºåŠ›ã¯å¾Œã‹ã‚‰ã©ã†ã«ã§ã‚‚ãªã‚‹ã˜ã‚ƒãªã„ã‹ã€
map関数ã®æ©Ÿèƒ½ã‚’æŒã£ãŸç„¡å関数を使ã£ã¦ã€ã•ã£ã作ã£ãŸãƒªã‚¹ãƒˆã‚’åŠ å·¥ã—ã¾ã™ã€‚具体的ã«ã¯ã€ä½œã£ãŸãƒªã‚¹ãƒˆã®3ã®å€æ•°ã¨5ã®å€æ•°ã¨3ã¨5ã®ä¸¡æ–¹ã®å€æ•°ã®ç®‡æ‰€ã‚’ã€ãã‚Œãžã‚Œã€Fizzã€Buzzã€FizzBuzzã«ç½®ãæ›ãˆã¾ã™ã€‚
(function(func, list) { var clone = []; for (var i = 0; i < list.length; i++) { clone[i] = func(list[i]); } return clone; })(function(x) { if (x % 15 === 0) { x = 'FizzBuzz'; } else if (x % 5 === 0) { x = 'Buzz'; } else if (x % 3 === 0) { x = 'Fizz'; } return x; }, (function(max, start) { var list = []; for (var i = start; i <= max; i++) { list.push(i); } return list; })(100, 1));
出力を考ãˆã‚‹
「プリントã›ã‚ˆ? 対話型インタプリタã§å®Ÿè¡Œã™ã‚Œã°çµæžœã®ãƒªã‚¹ãƒˆã¯ã‚¤ãƒ³ã‚¿ãƒ—リタãŒå°å—ã—ã¦ãれるã˜ã‚ƒãªã„ã‹ã€
「ã¾ã‚çµæžœã®ãƒªã‚¹ãƒˆã‚’printã—ã¦ã¿ã¦ã‚‚良ã„ã‹ã€
printã®ä»£ã‚ã‚Šã«ãƒ‡ãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã‚’使ã£ã¦ã„ã‚‹ã“ã¨ã‚’å‰æã§ã€console.log() ã§å‡ºåŠ›ã—ã¦ã¿ã¾ã™ã€‚
console.log((function(func, list) { var clone = []; for (var i = 0; i < list.length; i++) { clone[i] = func(list[i]); } return clone; })(function(x) { if (x % 15 === 0) { x = 'FizzBuzz'; } else if (x % 5 === 0) { x = 'Buzz'; } else if (x % 3 === 0) { x = 'Fizz'; } return x; }, (function(max, start) { var list = []; for (var i = start; i <= max; i++) { list.push(i); } return list; })(100, 1)));
è¦ç´ ã”ã¨ã«æ”¹è¡Œã—ã¦å‡ºåŠ›ã™ã‚‹
JavaScriptã¯ã€for-eachãŒä½¿ãˆãªã„環境も多ã„ã£ã½ã„ã®ã§ã€ã“ã“ã‚‚ç„¡å関数ã§ã€‚
(function(proc, list) { for (var i = 0; i < list.length; i++) { proc(list[i]); } })(function(x) { console.log(x); }, (function(func, list) { var clone = []; for (var i = 0; i < list.length; i++) { clone[i] = func(list[i]); } return clone; })(function(x) { if (x % 15 === 0) { x = 'FizzBuzz'; } else if (x % 5 === 0) { x = 'Buzz'; } else if (x % 3 === 0) { x = 'Fizz'; } return x; }, (function(max, start) { var list = []; for (var i = start; i <= max; i++) { list.push(i); } return list; })(100, 1)));
ã†ãƒ¼ã‚€ã€ç„¡é§„ã«ã‚„ã‚„ã“ã—ã„。åˆã£ã¦ã‚‹ã‹ã©ã†ã‹ã‚‚ã‚ã‹ã‚“ãªã„ã—。
ãŸã ã€ã“ã†ã‚„ã£ã¦ã²ã¨ã¤ã²ã¨ã¤ã®é–¢æ•°ã‚’次ã®é–¢æ•°ã«æ¸¡ã—ã¦ã„ãã¨ã€é–¢æ•°ãŒã“ã®ä¸–界を支é…ã—ã¦ã„る感覚を垣間見れãŸã‚ˆã†ãªæ°—ãŒã—ã¾ã™ã€‚ã•ã‚‰ã«ã“ã®ç™ºæƒ³ãŒå½“ãŸã‚Šå‰ã«ãªã‚Œã°ã€ç°¡æ½”ã«æ›¸ã‘ã‚‹Lispã®ä½¿ã„å‹æ‰‹ã¯ã€ãªã‹ãªã‹è‰¯ã„ã®ã‹ã‚‚ã—ã‚Œãªã„ã¨ã„ã†æ„Ÿè¦šã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã—ãŸã€‚
ã¨ã„ã†ã“ã¨ã§ã€ä»Šå¾Œã€é–¢æ•°åž‹è¨€èªžã«å…¥é–€ã—ã¦ã¿ã‚‹æ¬¡ç¬¬ã§ã™ã€‚