アドベントペアプロ #3 deno

2018/12/05のアドベントペアプロの議事録 ファシリテータ: @binaryta
セクリタリ: @binaryta
参加者: @__syumai
レポジトリ: https://github.com/denoland/deno
issue: https://github.com/denoland/deno/issues/1159

denoのTODOコメントを見てみた

TS側一部抜粋

$ find ./js -type f -print | xargs grep TODO

.//net.ts:// TODO support other types:
.//net.ts:// TODO Support finding network from Addr, see https://golang.org/pkg/net/#Addr
.//net.ts: * TODO: `tcp4` (IPv4-only), `tcp6` (IPv6-only), `udp`, `udp4` (IPv4-only),

.//net_test.ts:/* TODO Fix broken test.
.//net_test.ts:/* TODO Fix broken test.
.//net_test.ts:/* TODO Fix broken test.
  • denoのinterfaceにはGoを流用しているものがいくつかある
  • net_testなどは、Go標準ライブラリのtestを読みつつ書いたら直せるかも

Rust側一部抜粋

$ find ./src -type f -print | xargs grep TODO

.//version.rs:// TODO Extract this version string from Cargo.toml.

実際に読んでみた

TS側

net_test.ts

コメントアウトを外しても普通にテスト既存のテストコードが動いたので問題無さそう.

net.ts

9  export type Network = "tcp";
10 // TODO support other types:
11 // export type Network = "tcp" | "tcp4" | "tcp6" | "unix" | "unixpacket";
12 
13 // TODO Support finding network from Addr, see https://golang.org/pkg/net/#Addr
14 export type Addr = string;
15 

プロトコルの種類を増やしてtypeを増やすTODO. 重そうだから一旦無視.

issue

Use let in REPL gives ReferenceError #1159

https://github.com/denoland/deno/issues/1159

  • REPLの実行時にletで定義した変数を後から参照したらReferenceErrorが発生する.
  • constも同様にReferenceErrorが発生する.
  • varで定義したものは動作しているように見えるが、実際にはグローバル変数(windowのプロパティ)になっているだけだった.

問題

  • evalはグローバルのスコープで実行されてしまう
const myEvalGen = () => {
  const lines = [];
  return line => {
    lines.push(line);
    const code = lines.join(";");
    try {
      return eval(code);
    } catch (err) {
      lines.pop();
      throw err;
    }
  };
};

const myEval = myEvalGen();
myEval("const a = 1;");
myEval("const b = 2;");
myEval("a + b;");
// => 3
myEval("a + b + c;");
// error thrown
myEval("const c = 3;");
myEval("a + b + c;");
// => 6 (error fixed)

解決策)

  1. 1行1行のソースコードlines配列にpushしていき、eval実行の行を毎度バッファする.
  2. 例外を一度でも吐くと、以降も例外が引き継がれてしまうでの、try/catchにより例外時の行はバッファから取り除く(popする)