Node.jsをPython-Likeにする

javascriptを上達させたいけど、非同期ioが足を引っ張って競技プログラミングを解くのには使いにくい。
そこで自前でPythonっぽい関数を実装してみた。

環境

windowsマシンゆえに

main(require('fs').readFileSync('/dev/stdin', 'utf-8'))

が使えない。提出する分には問題ないが、デバッグする時に困る。

実装した関数

input()

コンソールから入力を1行だけ文字列として受け取る関数。
Pythoninput()を模した。
異なる点は使用する際にawaitを付けるということ。

  • コード
function input(){
    const readline = require('readline')
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    return new Promise((resolve, reject) => {
        rl.on('line', (line) => {
            resolve(line);
            rl.close();
        })
    })
}
  • 使用例
async function main(){
    const n = await input(); //await はasync関数の中でのみ有効
    const ans = (n <= 999) ? 'ABC' : 'ABD';
    console.log(ans);
}
  • 解説(備忘録)

input関数はreadlineモジュールの'line'イベントを実行するPromise(PythonでいうとFuture)オブジェクトを返す。

async関数内でawaitを付けてinput関数を呼び出すことで、インタープリターはPromiseが完了するまで次の行へは進まずに待機する。

Promiseは完了するとresolveの中身を返すので、それを変数nで受け取っている。

  • 参考

ja.javascript.info
(accessed on 2020/09/25)
nodejs.org
(accessed on 2020/09/25)

以前自作したツールのテンプレートとして登録すれば準備完了だ。
https://nnt339es.hatenablog.com/entry/2020/09/25/153524nnt339es.hatenablog.com

というわけでもなく、アルゴリズムを柔軟に実装するにはもう少し自前ライブラリが必要と感じた。