ドメイン特化言語の正誤表

どんな本にも間違いがあるように、私も間違いを犯しています。このページには、現在までに確認されている本書の誤りがリストされています。ここにない間違いを見つけた場合は、お知らせください。

第2版以降の印刷における誤り

122ページ §8.1: 図8.1で、イベントラベルが逆になっています。オンからオフへの遷移のイベントは、switchDownと読み替える必要があります。(私が英国で育ち、今は米国に住んでいるせいだと弁解させてください。)

第1版の印刷における誤り

9ページ §1.2: ステートマシンクラスのコードで、開始状態のgetterの宣言を示していません: public State getStart() {return start;} [第2版で修正済み]

20ページ §1.5: 両方の図で、"eligable"と記述していますが、"eligible"と記述すべきです。[第2版で修正済み]

27ページ §2.1: 2つ目の箇条書き。"the way they can by composed"は"the way they can be composed"と読み替える必要があります。[第2版で修正済み]

32ページ §2.1.2: 最初の参照で、私が参照している例は1.3節、12ページにあります。[第2版で修正済み]

61ページ §3.6.3: 「異なるメカニズムを使いすぎる」の節の最初の段落は、「2つの異なるメカニズムを使う」と読み替える必要があります。[第2版で修正済み]

73ページ §4.3: ページの3番目の段落で、「diskSizeの呼び出しを検討してください」は「sizeの呼び出しを検討してください」と読み替える必要があります。[第2版で修正済み]

98ページ §5.3.4: 最後から2番目の段落で、「同様に入力の2行目を認識します」は「同様に入力の3行目を認識します」と読み替える必要があります。[第2版で修正済み]

119ページ §7.1.3: 図7.3では、収集状態と支払い状態の間の両方の遷移の矢印の向きが逆である必要があります。[第2版で修正済み]

122ページ §8.1: 図8.1で、イベントラベルが逆になっています。オンからオフへの遷移のイベントは、switchDownと読み替える必要があります。(私が英国で育ち、今は米国に住んでいるせいだと弁解させてください。)

131ページ §9.2: 5段落目。「アクティブな状態からライト待ち状態へ」は、「アクティブな状態からドロワー待ち状態へ」と読み替える必要があります。図も「draw」ではなく「drawer」と表示する必要があります。[第2版で修正済み]

140ページ §9.5: 節の4段落目。「MetaCaseのMetaEditから」は「MetaCaseのMetaEditから」と読み替える必要があります。からMetaCase」[第2版で修正済み]

143ページ §9.7: 最後の段落:「試す価値はあります」には「試す」が1つだけ必要です。[第2版で修正済み]

152ページ §10.4: このセクションの最後の段落で、「構文木の制約は通常、妨げるよりも役立ちます」は「構文木の制約は通常、役立つよりも妨げます」と読み替える必要があります。[第2版で修正済み]

205ページ §17.3.1: UML図では、ロケーション仕様からホテルへの多重度が*:1ですが、*:*である必要があります。[第2版で修正済み]

206ページ §17.3.1: 本文ではOfferクラスについて言及していますが、コードが抜けていました。以下にコードを示します。

class Offer...
    public int Score(Activity a) {
      return Location.IsSatisfiedBy(a) && Activity.isSatisfiedBy(a) 
          ? Reward.Score(a) : 0;
    }
    public Reward Reward { get; set; }
    public LocationSpecification Location { get; set; }
    public ActivitySpecification Activity { get; set; }
[第2版で修正済み]

215ページ §17.4: ページの下から2番目の段落で、「primeStateメソッド」は「primeMachineメソッド」と読み替える必要があります。IntelliJのリファクタリングの名前変更は優れていますが、それほど優れてはいません。[第2版で修正済み]

221ページ §18.1.1: 最初のブロックで、トークン定義は大文字にする必要があるので、ブロックは次のように読み替える必要があります

Event-keyword: 'events';
Command-keyword: 'commands';
End-keyword: 'end';
Identifier: [a-zA-Z0-9]*;
[第2版で修正済み]

221ページ §18.1.1: 最初のコードフラグメント。identifier: [a-z A-Z 0-9]*;という行はidentifier: [a-zA-Z0-9]*;と読み替える必要があります(文字クラスのスペースを削除しました)。[第2版で修正済み]

222ページ §18.1.1: ページの下部にあるコード行。code: [A-Z 0-9]{4}code: [A-Z0-9]{4}と読み替える必要があります(文字クラスのスペースを削除しました)。[第2版で修正済み]

226ページ §18.1.2: ページの最初の段落。「パーサーをアクティビティとして参照する傾向がある」は「*“parse”*をアクティビティとして参照する傾向がある」と読み替える必要があります。[第2版で修正済み]

228ページ §29.1.1: 最後の段落で、"%prec UNMINUS"は"%prec UMINUS"と読み替える必要があります。[第2版で修正済み]

264ページ §22.3: 最初の段落の3行目。「結果のアクション値」は「結果のマッチ値」と読み替える必要があります。[第2版で修正済み]

267ページ §22.3: 3番目のコードセグメント。eventDecList: eventDec+eventDecList: eventDec*と読み替える必要があります。[第2版で修正済み]

268ページ §22.3: 2番目のコードセグメント。eventDec: identifier identifierは、ルールの以前の記述と一致するようにeventDec: IDENTIFIER IDENTIFIERと読み替える必要があります。[第2版で修正済み]

276ページ §23.3.3: ページの最後の段落で、「ローダーとして文法に追加する」は「ヘルパーとして文法に追加する」と読み替える必要があります。[第2版で修正済み]

279ページ §23.3.4: 279ページの上部「reportErrorsをオーバーライドする必要はなくなりました」は「reportErrorsをオーバーライドする必要はなくなりました」と読み替える必要があります。[第2版で修正済み]

301ページ §25.3: 最初のコードブロックの直後にある「文法の最上位レベルは、ステートマシンファイルを定義します」という行は、「文法の最上位レベルは、ステートマシンを定義しますファイル。」と読み替える必要があります。[第2版で修正済み]

303ページ §25.3: ページの下部にある最後のコードセグメントaddResetEventは、直前のコードから不必要に繰り返されています。[第2版で修正済み]

306ページ §26.3: セクションの4番目の段落:「ANTLR文法ファイルをラップする」は「ANTLRで生成されたパーサーをラップする」と読み替える必要があります。[第2版で修正済み]

307ページ §26.3

残りの計算機のコードサンプルには、mult_expの句がありません

  mult_exp returns [double result]	
  	: a=power_exp {$result = $a.result;}
   	  ( '*' b = power_exp {$result *= $b.result;}
   	  | '/' b = power_exp {$result /= $b.result;}
   	  )*
   	;
      
[第2版で修正済み]

322ページ §28.1.2: ページの最後の段落「FlexはlexのGNUバージョン」は「Flexはlexのオープンソースバージョン」と読み替える必要があります。Flexは通常Bisonに付属しており、BisonはGNUプロジェクトであるため、FlexもGNUであると誤って思い込んでしまいました。[第2版で修正済み]

353ページ §33.3: ページの最後の段落。「収集用の値を作成する」は「収集用の子ビルダーを作成する」と読み替える必要があります。[第2版で修正済み]

358ページ §34.1: 3段落目。「親関数は子関数で必要な引数を正確に定義できます」は「親関数は子関数を使用して必要な引数を正確に定義できます」と読み替える必要があります。[第2版で修正済み]

374ページ §35.1: 3番目のコードフラグメント、private HardDrive speed (int arg) {は、正しく使用できるようにpublic HardDrive speed (int arg) {と読み替える必要があります。[第2版で修正済み]

382ページ §35.4: 3番目のコードフラグメント private HardDriveBuilder SATA {public HardDriveBuilder SATA {と読み替える必要があります。[第2版で修正済み]

387ページ §36.3: DSLスクリプトの最後の4行は、例で説明も使用もされていないため、削除する必要があります。[第2版で修正済み]

387ページ §36.3.2: DSLスクリプトの最後の4行は、例で説明も使用もされていないため、削除する必要があります。[第2版で修正済み]

392ページ §36.4: DSLスクリプトの最後の5行は、例で説明も使用もされていないため、削除する必要があります。[第2版で修正済み]

411ページ §38.6: セクションの2番目の段落。「必ずしもフィットしない」は「必ずしもうまくフィットしない」と読み替える必要があります。[第2版で修正済み]

420ページ §40.1: ページの2行目。コードprocessor("cores", 2, "type" "i386")は、最後の2つの引数の間にコンマがありません。[第2版で修正済み]

431ページ §41.3.1: 「プロモーションは一連のルールです」で始まる段落の後、コードclass Itineraryclass Promotionと読み替える必要があります。[第2版で修正済み]

432ページ §41.3.1: (「ここでのアプローチは」で始まる) 上部の段落の後、コードclass Itineraryclass Promotionと読み替える必要があります。[第2版で修正済み]

434ページ §41.3.2: 「適切なルールを作成します」で終わる段落は、「適切なルールを設定します」と読み替える必要があります。 [第2版で修正済み]

434ページ §41.3.2: コード例では、PromotionBuilderクラスで定義されているadd_conditionメソッドの内容が示されていません。このメソッドの本体は次のとおりです:@rules.last.add_condition arg。[第2版で修正済み]

436ページ §41.4.2: このセクションのさまざまな場所で、クラスConditionAtributeNameBuilderには「t」が欠落しており、ConditionAttributeNameBuilderと読み替える必要があります。[第2版で修正済み]

436ページ §41.4.2: 「条件を構築するには」で始まる段落で、「名前、演算子、条件の3つの部分があります」というフレーズは、「名前、演算子、の3つの部分があります」と読み替える必要があります。[第2版で修正済み]

437ページ §41.4.2: コード行attr_reader :condition_classはデッドコードであり、削除する必要があります。[第2版で修正済み]

448ページ §42.1.2: 最後の段落の最初の文、「処理は、処理の複数の定義で複数の場所で発生する可能性があります」は、処理は、処理の複数の定義なしに、複数の場所で発生する可能性がありますと読み替える必要があります。[第2版で修正済み]

451ページ §42.4: 最初のコードフラグメントで、Domain ObjectDomainObject(スペースなし)と読み替える必要があります。[第2版で修正済み]

451ページ §42.3: コードサンプルで、class ValidRangeFieldValidatorは、実装関係を明確にするためにclass ValidRangeFieldValidator implements FieldValidatorと読み替える必要があります。[第2版で修正済み]

468ページ §44.1: セクションの4段落目。「コンストラクターにコードを入れてフィールドを投入する」は「初期化メソッドにコードを入れてフィールドを投入する」と読み替える必要があります。コンストラクターはこのアプローチの有効な初期化メソッドですが、次の例のように他の方法も使用できます。[第2版で修正済み]

479ページ §45.3: 3番目のテキスト段落で、コードbuilder_has_rule?builder.has_rule?と読み替える必要があります(ドットがアンダースコアを置き換える)。[第2版で修正済み]

499ページ §48.3: ページの最初のコードサンプル (contentフィールドとコンストラクター) は、クラスConditionBlockの一部です。[第2版で修正済み]

500ページ §48.3: ページの2番目のコードサンプル(Matchesメソッド)は、クラスConditionBlockの一部です。[第2版で修正済み]

510ページ §49.3.1: 最後から2番目の行「特に子猫に」は、「特にハムスターに」と読み替える必要があります(この本の制作中に子猫が傷つけられたことはありません)。[第2版で修正済み]

519ページ §50.3.2: ValidationRuleBuilderのコードがありません。次のようにする必要があります

  class ValidationRuleBuilder : WithParser {
    readonly string description;
    readonly ValidationEngine engine;
    public ValidationRuleBuilder(string description, ValidationEngine engine) {
      this.description = description;
      this.engine = engine;
    }
    public void With(Predicate<Person> condition) {
      engine.AddRule(condition, description);
    }
  }

 
[第2版で修正済み]

519ページ §50.3.1: 段落の最後の行。engine.Run(john)はengine.Run(tim)と読み替える必要があります。[第2版で修正済み]

523ページ §50.4: 最初の行の「Productive Solider」は「Productive Soldier」と読み替える必要があります。[第2版で修正済み]

528ページ §51.1: 図51.1において、収集状態と支払い状態間の両方の遷移矢印が逆向きになっているべきです。[第2刷で修正済み]

540ページ §53.1: ページ上の2段落目:「テンプレートはソーステキストです」は「テンプレートはソーステキストです」と読み替えるべきです。[第2刷で修正済み]

554ページ

このページは空白ですが、以下のテキストが含まれている必要があります。

「(例えば) HTMLデザイナーがリンク出力にスタイルクラスを追加したいとします。もしEmbedment Helperがそのリンクを生成する場合、デザイナーはその変更を行うためにプログラマーと連携する必要があります。もちろん、これは異なる人々が異なるファイルで作業している場合にのみ問題になります。DSLのコードを生成する場合、通常はそうではありません。」

[第2版で修正済み]

556ページ §55.1: セクションの最後の段落、最後から2番目の文:「コード生成プロセスを実行して」は「コード生成プロセスを実行せずに」と読み替えるべきです。[第2刷で修正済み]

558ページ §55.3: 下から9行目。「ステートマシンとコントローラーを静的変数として宣言します」は「ステートマシンとコントローラーを静的グローバル変数として宣言します」と読み替えるべきです。[第2刷で修正済み]

566ページ §55.4: 最初のコードフラグメントの直後。「静的宣言関数を呼び出す」は「静的宣言関数を呼び出す」と読み替えるべきです。[第2刷で修正済み]

580ページ: 「Java 5を使用した安全で組み込み可能なDSLの設計について」というタイトルの論文は、「Java 5を使用した安全で柔軟な組み込み可能なDSLの設計について」というタイトルであるべきです。[第2刷で修正済み]


これらの誤りを見つけて教えてくれた大友歩、坂本直樹、大塚康史、平沢彰、アハマド・ヒンディ、高橋譲、ニコラス・ラドクリフの各氏に深く感謝します。