開発環境
- macOS High Sierra - Apple(OS)
- Emacs (Text Editor)
- Python 3,、JavaScript(プログラミング言語)
- Safari(Web ブラウザー)
今朝のコント。
— 結城浩 (@hyuki) 2017年10月18日
カフェの注文を店員さんがさわやかに復唱するので気持ちがいい。
「アメリカンコーヒーお願いします」
「はい、アメリカンコーヒーですね!」
「支払いはSuicaで」
「はい、Suicaですね!」
「(ピコッ)」
「…すみません、ご注文は何でしたでしょうか?」
朝は忙しいですものね…
無限ループの予感…
— 大人の天然素材ゼルプスト殿下プレミアム (@tenapyon) 2017年10月18日
ということで、「無限ループの予感」を JavaScript で考えてみることに。
同じ会話の繰り返しをそのまま出力すると速すぎるので、一定の間隔でお互いの会話を表示することに。
JavaScript に慣れてなくて他の言語を使ってると、無限ループの会話の各メッセージを表示するときwhile loop、あるいは再帰関数で書くことを考え、早すぎる場合はsleep(一定時間プログラムを止める)を利用しようとする(?)けど、JavaScript には sleep 関数が無い。ということで、setInterval 関数を活用。
まずは、while loop と sleep を使った場合のコードを Python で書いてみて、その次に同様のことをするプログラムを JavaScript で書いてみる。
コード(Emacs)
Python 3
#!/usr/bin/env python3
import time
import datetime
i = 0
messages = [
'アメリカンコーヒーお願いします。',
'はい、アメリカンコーヒアメリカンコーヒーですね!',
'支払いはSuicaで',
'はい、Suicaですね',
'(ピコッ)',
'…すみません、ご注文は何でしたでしょうか?'
]
while True:
print(f'{messages[i]}({datetime.datetime.now().second})')
i += 1
if i == len(messages):
i = 0
time.sleep(1.5)
入出力結果(Terminal, Jupyter(IPython))
$ ./sample.py
アメリカンコーヒーお願いします。(11)
はい、アメリカンコーヒアメリカンコーヒーですね!(13)
支払いはSuicaで(14)
はい、Suicaですね(16)
(ピコッ)(17)
…すみません、ご注文は何でしたでしょうか?(19)
アメリカンコーヒーお願いします。(20)
はい、アメリカンコーヒアメリカンコーヒーですね!(22)
支払いはSuicaで(23)
はい、Suicaですね(25)
(ピコッ)(26)
…すみません、ご注文は何でしたでしょうか?(28)
アメリカンコーヒーお願いします。(29)
^CTraceback (most recent call last):
File "./sample.py", line 20, in <module>
time.sleep(1.5)
KeyboardInterrupt
$
HTML5
<pre id="output0"></pre> <button id="clear0">最初から</button> <script src="sample.js"></script>
JavaScript
let i = 0,
tm,
messages = [
'アメリカンコーヒーお願いします。',
'はい、アメリカンコーヒアメリカンコーヒーですね!',
'支払いはSuicaで',
'はい、Suicaですね',
'(ピコッ)',
'…すみません、ご注文は何でしたでしょうか?'
],
len = messages.length,
pre0 = document.querySelector('#output0'),
btn_order0 = document.querySelector('#order0'),
btn_clear0 = document.querySelector('#clear0'),
inputs = [btn_clear0, btn_clear0],
p = (x) => pre0.textContent += x + '\n';
order = () => tm = setInterval(
() => {
p(messages[i]);
i += 1;
i = i === len ? 0 : i;
}, 1500),
clear = () => {
pre0.textContent = '';
i = 0;
clearInterval(tm);
order();
};
btn_clear0.onclick = clear;
order();
0 コメント:
コメントを投稿