2017年4月25日火曜日

開発環境

メタプログラミング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 コメント:

コメントを投稿