import java.io.IOException;


/**
 * リスト構造のconsセル
 */

public final class Cons extends Cell implements java.io.Serializable {

  /****************/
  /* PUBLIC FIELD */
  /****************/
  /** car部 */
  public Cell car;

  /** cdr部 */
  public Cell cdr;

  /***************/
  /* CONSTRUCTER */
  /***************/
  /**
   * 実際のインスタンス生成には、Listクラスのユーティリティ・メソッド cons() を使う。
   */
  Cons() {
  }

  /*****************/
  /* PUBLIC METHOD */
  /*****************/
  /**
   * リストを表す文字列を返す。
   * リストは括弧“(”、“)”で囲まれる。
   * 末尾がnilでないリストは、ドット表現が使われる。
   * @return		自身の文字列表現
   */
  public String toString() {
    String s = "(" + this.car;
    Cell c;
    for ( c=this.cdr; !c.isAtom(); c=((Cons)c).cdr ) {
      s += " "+((Cons)c).car;
    }
    if ( c!=List.nil ) {
      s += " . "+c;
    }
    s += ")";
    return s;
  }

  /******************/
  /* PRIVATE METHOD */
  /******************/
  /**
   * オブジェクト入力ストリームからのオブジェクト入力処理を行う。
   * @param in		オブジェクト入力ストリーム
   */
  private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();	// フィールドの設定を行う。
    List.entryCons(this);	// ハッシュテーブルに登録する。

    /* nilアトムを置き換える */
    if ( car.isAtom() && car.toString().equals("nil") ) {
      car = List.nil;
    }
    if ( cdr.isAtom() && cdr.toString().equals("nil") ) {
      cdr = List.nil;
    }

  }

}

