開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- Node.js, Safari(JavaScript エンジン)
- Learning JavaScript [邦訳](参考書籍)
メタプログラミングRuby 第2版(Paolo Perrotta (著)、角 征典 (翻訳)、オライリージャパン)の1部(メタプログラミング Ruby)、4章(水曜日: ブロック)、4.7(クイズ: より良い DSL)、4.7.1(ビルの逃亡)、4.7.2(クイズの答え)、「グローバル」変数の削除を JavaScript で取り組んでみる。
HTML5
<pre id="output0"></pre> <button id="run0">run</button> <button id="clear0">clear</button> <script src="sample5.js"></script>
JavaScript
let btn0 = document.querySelector('#run0'), btn1 = document.querySelector('#clear0'), pre0 = document.querySelector('#output0'), p = (x) => pre0.textContent += x + '\n'; let event = (description, block) => events.push({description: description, condition: block}); events = [], setups = [], setup = (fn) => setups.push(fn); setup(() => { p('空の高さを設定'); skyHeight = 100; }); setup(() => { p('山の高さを設定'); mountainsHeight = 200; }); event('空が落ちてくる', () => skyHeight < 300); event('空が近づいてい', () => skyHeight < mountainsHeight); event('もうだめだ…手遅れ', () => skyHeight < 0); (() => { let setups = [], events = []; window.setup1 = (block) => setups.push(block); window.event1 = (description, block) => events.push({description:description, condition: block}); window.eachSetup = (block) => setups.forEach((setup) => block(setup)); window.eachEvent = (block) => events.forEach((event) => block(event)); })(); setup1(() => { p('空の高さを設定'); skyHeight = 100; }); setup1(() => { p('山の高さを設定'); mountainsHeight = 200; }); event1('空が落ちてくる', () => skyHeight < 300); event1('空が近づいてい', () => skyHeight < mountainsHeight); event1('もうだめだ…手遅れ', () => skyHeight < 0); let output = () => { p('クイズ: より良い DSL'); events.forEach((event) => { setups.forEach((setup) => { setup(); }); if (event.condition()) { p(`ALERT: ${event.description}`); } }); p('「グローバル」変数の削除'); eachEvent((event) => { eachSetup((setup) => setup()); if (event.condition()) { p(`ALERT: ${event.description}`); } }); }; btn0.onclick = output; btn1.onclick = () => pre0.textContent = ''; output();
0 コメント:
コメントを投稿