開発環境
- 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 コメント:
コメントを投稿