====
2011 年 2 月 12 日 ShizuDev JavaScipt Good Parts 第 1 回読書会
於 富士 コミュニティf

版・刷が古い人はまず http://www.oreilly.co.jp/books/9784873113913/ の正誤表をチェックしましょう。
(きしもとのは初版第1刷でした。最近買ったのになぁ)

鉄道ダイヤグラムは英語版のが http://oreilly.com/javascript/excerpts/javascript-good-parts/syntax-diagrams.html にある。

1 章

静岡県の形はλ

2 章

「鉄道ダイヤグラム」というのはこの本独自の用語?
Rails とかにありそう?

このような構文図は、PASCAL( http://www.amazon.co.jp/dp/4563014621 )とか
でも使われている。

『本章で出てくる「良いパーツ」の文法は、言語全体の文法と比較すると、かなり簡単な
ものになっている。』と書かれているように、2 章で紹介する文法からすでに Good Parts は
始まっている。JavaScript の言語仕様としての構文を確認したい場合は ECMA の仕様などで
確認する。

任意の場所から始めて任意の場所で終われるコメント(行指向でないコメント)は
欲しいこともある、かな。最近見かけたものでは [ruby-core:33948] からはじまるスレッドとか。

図 2-2 に従うと名前は "_" から始められない。これは Good Parts のひとつか?
( C 言語の仕様では( JIS X 3010-1993 §7.1.3 )「予約」になっていたりする)
処理系で試してみると普通に使える。

図 2-7 / は \ の誤植。それぞれに " または ' が含まれない、という説明が抜けている。

ダブルクオートとクオートの使い分け。REPL がある言語では文字列が REPL で
どう出力されるかに合わせる、という手もある。
JavaScript の標準的な文字列表現は何か?
関数を document.writeln すると関数のソースコード表現が見られる。

フォームフィードってなんだ? 紙送りのコントロールコード。コントロール L

ユニコードエスケープは必ず 4 文字。ASCIIな文字でも 4 文字必要。

§2.5 の最初にグローバル名前空間の話があるがなんか唐突だ。

図 2-9 var文、図 2-10 命令文 で、どちらも 0 回以上任意回の繰り返しを含んだ文法に
なっている。これはあまり見かけない。ふつうは、たとえばブロックの定義のほうに、
繰り返しのループを含ませる。

たとえば普通 if 文の定義において、

<if文> :== "if" "(" <式> ")" <文> [ "else" <文> ]

のようにするので、繰り返しが <文> の定義の中にあるとまずいし、また
複文(ブロック)は文に含まれる、というように定義するのだが、本書では、
if 文の then 節などは必ず { } で囲む(構文図では「ブロック」)としているので
(9章「スタイル」に書かれている)、このような定義でも困らない。

var 文や命令文の文法は、「空」を繰り返さないよう工夫されている。
(そのままパーサに落とすと、「空」の繰り返しがあると無限ループを起こしうる)

スコープが作られないのであまり意味がないのだが、仕様ではブロックも
命令文の一種。

図 2-13 if 文。else の直後に if が来る場合だけは波括弧は付かない、という
規則になっていることに注意。どんな時も else の後ろは絶対波括弧、とすると、
else-if で羅列、という以下のようなパターンがこのようにみにくくなる。

if (x === 0) {
  ...
} else {
  if (x === 1) {
    ...
  } else {
    if (x === 2) {
      ...
    }
  }
}

図2-13 if の then 節 / else 節 がブロックになってるのは Good Parts 。

文法にまぎれて、さらっと重要なことが書いてある。falsy 、すなわち偽と
評価される値。
これは言語によって非常にまちまちな点なので要注意。

switch 文。フォールスルーは使わない、という文法になっている。
switch 文の比較は === でおこなわれる( ECMA-262 §12.11 )。

古い版では図 2-10 でラベルが付く文と付かない文の区別が変になっている。

throw で投げるオブジェクト は name と message の 2 つのプロパティを、
ってどこの規約だ?

return で何か返さないと undef

式文と式を別々にしている。代入など副作用がある(ないし、ありうる。関数呼び出しに
副作用があるかどうかは定義の内容次第)ものは「式文」、「式」は副作用がない。

この本の構文図で「式文」が現れるところはごく限られていて、for の初期化部分と
増加部分だけ。(a = 1) + (b = 2) のように、代入式(この本では「式文」)の値を
使うのは、Good Parts でない、ということのようだ。

言語仕様では、代入なども全部「式」である。

やってみよう → 三項演算子で FizzBuzz( ShizuDev )

言語仕様には、C 言語と同様のコンマ演算子がある。これも Good Parts でない、
ということなのだろう。

オブジェクトリテラルで key に name や文字列だけじゃなくて数値も使えちゃう
みたいだけど仕様上どうだろう?
調べてみると a = {1: 'foo'} は a = {'1': 'foo'} の意味になっている。そして a[1] でも
アクセスできる。awk っぽい?

図2-32 正規表現のオプションの出現順序は決められてるのか?
(任意の順序でそれぞれたかだか一回、という規則を構文規則に落とすのは難しい)

図2-35 var文をまとめるのは Good Parts?

== と === のちがい。== は謎い。「等値演算子」と「同値演算子」(←って最初に呼んだのは誰?)
同値関係じゃないことがある(推移律が壊れてたりする。§B.1 参照)のが等値演算子、
と覚える?

ECMA-262 の用語では、これらの演算子の総称が Equality Operators で、== が Equals Operator 、
=== が Strict Equals Operator 。

3章

3.4 (例によって)ビミョーな「参照渡し」原書はどうか?
3.5 サンプルのコードで if をなんのためにやってるか謎

次回 3/26 三島(予定), 次々回 4/16(予定)