いまどきのプログラム言語の作り方・正誤情報

最終更新日 2005/10/20

■初版での誤り
●69P リスト3−17
(誤)
  public abstract class JTCode {
  }
  リスト JTCode.java

  今のところ、中身はありません。
      
(正)
  public abstract class JTCode {
    public JTCode run() throws Exception{
      return this;
    }
  }
  リスト JTCode.java

  今のところ、中身はメソッドrun()だけになります。
  run()メソッドは実際の計算を行うメソッドです。クラスJTCodeでは単にthisを返すようにしておきます。こうしておけば、後で出てくる数値を表すクラスなど、計算を必要としないいくつかのクラスで使い回せて便利です。
      
●76P 9行目
(誤)
        System.out.println("result = " + code.toString());            // (ア)結果を表示
      
(正)
        System.out.println("result = " + code.run().toString());      // (ア)結果を表示
    
●91P  リスト4−9  3行目から
●97P  リスト4−13 3行目から
●210P リスト8−4  3行目から
(誤)
    switch(token){
    case EOS:    // 空のプログラム
      break;
    case INT:
      code = new JTInt((Integer)lex.value());
      getToken();
      break;
      
(正)
    switch(token){
    case TokenType.EOS:    // 空のプログラム
      break;
    case TokenType.INT:
      code = new JTInt((Integer)lex.value());
      getToken();
      break;
      
●92P (リストを除いた)1行目
(誤)
run()メソッドは実際の計算を行うメソッドです。クラスJTCodeでは単にthisを返すようにしておきます。こうしておけば、後で出てくる数値を表すクラスなど、計算を必要としないいくつかのクラスで使い回せて便利です。
(正) (上記を削除)
●92P リスト4−10 4〜5行目
(誤)
  private JTCode code1; // 左側の式
  private JTCode code2; // 右側の式
      
(正)
  protected JTCode code1; // 左側の式
  protected JTCode code2; // 右側の式
    
●199P 下から10行目
(誤)
      JTCode c = (JTCode)list.get(i);
      
(正)
      JTCode c = (JTCode)args.get(i);
      
●212P リスト8−5
(誤)
import java.util.ArrayList;

public class JTDotExpr extends JTCode {

  private JTCode code;
  private JTSymbol symbol;
  private ArrayList list = null;

  public JTDotExpr(JTCode c, JTSymbol sym) {
    code = c;
    symbol = sym;
  }

  public JTCode run() throws Exception {
    JTCode c;
    c = code.run();
    c = c.message(symbol);    // (A)
    return c;
  }

}
      
(正)
public class JTDotExpr extends JTCode {

  private JTCode code;
  private JTSymbol symbol;

  public JTDotExpr(JTCode c, JTSymbol sym) {
    code = c;
    symbol = sym;
  }

  public JTCode run() throws Exception {
    JTCode c;
    c = code.run();
    c = c.message(symbol);    // (A)
    return c;
  }

}
      
●231、232P リスト9−7
(誤)
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;

public class JTObject extends JTCode {

  Hashtable slots;

  public JTObject(Hashtable tbl){
    slots = tbl;
  }

  public String toString() {
    return "";
  }

  // 指定された名前のスロットが存在するかどうかの判定
  public boolean hasSymbol(JTSymbol sym) {
    if(slots.containsKey(sym)){
      return true;
    }
    return false;
  }

  // 指定された名前のスロットの値を得る
  public JTCode getSymbolValue(JTSymbol sym) {
    JTCode code = null;
    if(slots.containsKey(sym)){
      code = (JTCode)slots.get(sym);
    }
    return code;
  }

  public JTCode run() throws Exception {
    Enumeration e = slots.keys();
    while(e.hasMoreElements()){  // slotsのキーが存在する限り繰り返す。
      JTSymbol sym = (JTSymbol)e.nextElement();
      JTCode c = (JTCode)slots.get(sym);
      if(c instanceof JTDefVar){
        // JTDefVarのインスタンであれば初期値を評価して
        // 評価後の値を、改めて登録する。
        JTDefVar def = (JTDefVar)c;
        c = def.getCode();
        if(c != null){
          c = c.run();
        }
        slots.put(sym, c);
      }
    }
    return this;
  }
}
      
    
  
  
(正)
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;

public class JTObject extends JTCode {

  Hashtable slots;

  public JTObject(Hashtable tbl){
    slots = tbl;
  }

  public String toString() {
    return "";
  }

  // 指定された名前のスロットが存在するかどうかの判定
  public boolean hasSymbol(JTSymbol sym) {
    if(slots.containsKey(sym)){
      return true;
    }
    return false;
  }

  // 指定された名前のスロットの値を得る
  public JTCode getSymbolValue(JTSymbol sym) {
    JTCode code = null;
    if(slots.containsKey(sym)){
      code = (JTCode)slots.get(sym);
    }
    return code;
  }

  // 指定された名前のスロットに値をセットする
  public void set(JTSymbol sym, JTCode code) throws Exception {
    if(slots.containsKey(sym)){
      slots.put(sym, code);
    }else{
      throw new Exception("対応するフィールドがありません。");
    }
  }

  public JTCode run() throws Exception {
    Enumeration e = slots.keys();
    while(e.hasMoreElements()){  // slotsのキーが存在する限り繰り返す。
      JTSymbol sym = (JTSymbol)e.nextElement();
      JTCode c = (JTCode)slots.get(sym);
      if(c instanceof JTDefVar){
        // JTDefVarのインスタンであれば初期値を評価して
        // 評価後の値を、改めて登録する。
        JTDefVar def = (JTDefVar)c;
        c = def.getCode();
        if(c != null){
          c = c.run();
        }
        slots.put(sym, c);
      }
    }
    return this;
  }
}
      
    
  



●238P 例3(●248Pも同様)
(誤)
o = object {
  def x = 1;    // インスタンス変数x

  fun f(){
    def x = 3;  // ローカル変数x
    x;          // ここのxはローカル変数xを指して欲しい。
  };
};
o.f();  // => 3が返ってきてほしい。
      
(正)
o = object {
  def x = 1;    // インスタンス変数x

  fun f(){
    def x = 3;  // ローカル変数x
    x;          // ここのxはローカル変数xを指して欲しい。
  };
};
print(o.f());  // => 3が返ってきてほしい。