アドベントペアプロ #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行のソースコードlines配列にpushしていき、eval実行の行を毎度バッファする.
- 例外を一度でも吐くと、以降も例外が引き継がれてしまうでの、try/catchにより例外時の行はバッファから取り除く(popする)