==== 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(予定)