工学部情報学科計算機科学コース

計算機科学実験及演習4(プログラム検証)

担当教員
末永(ksuenaga)
担当TA
西田(nishida)

What's New

FAQ

Q: (コメントに)日本語を混ぜると #use で読み込めません.

A: ファイルの文字コードを EUC-JP にしてください. Emacs であれば,C-x RET f euc-jp-unix としてください.

Q: Emacs 上で tuareg-run-caml が実行できません.

A: tuareg-mode を呼び出してから,tuareg-run-ocaml を実行してください.

部屋割り

座学情報3講義室
演習一階端末室

実験日程(目安)

日付締切範囲レポート課題
  • 11/27(木)
  • 11/28(金)
  • 12/4(木)
  • 12/5(金)
12/31(水) OCaml演習 課題1: Ex.2.6(2),(4), Ex.3.7, Ex.3.11, Ex.4.1, Ex.4.4, Ex.4.5, Ex.4.7, Ex.5.3(1)-(6)より4つ, Ex.5.6, Ex.6.2, Ex.6.6, Ex.6.9, Ex6.10(1)-(5) より2つ.Ex.7.2, Ex.7.4, Ex.7.6, Ex.7.8
  • 12/11(木)
  • 12/12(金)
  • 12/18(木)
  • 12/19(金)
1/31(土) インタプリタ作成実験 課題2: 必修課題・問いたオプション課題の★の数の合計が5個以上
  • 1/8(木)
  • 1/9(金)
  • 1/15(木)
  • 1/16(金)
  • 1/23(金)
1/31(土) 型検査・推論器作成実験 課題3: 必修課題・実験全体への感想や意見などの自由記述

座学の予定

日付内容(予定)
11/27(木) 13:00「Objective Caml 入門」第1〜3章
12/4(木) 13:00「Objective Caml 入門」第4〜7章
12/11(木) 13:00インタプリタ作成 (ML1,ML2,ML3)
12/18(木) 13:00インタプリタ作成 (ML4,ML5)
1/8(木) 13:00型検査器作成 (4.1)
1/21(水) 13:00型推論器作成 (4.3)

レポートの提出方法・注意

課題レポートの提出にはオンライン提出システムを使用すること.(ID,パスワードは別途配布する.)その他, 実験に関する質問などは isle4fp2014@fos.kuis... で受け付ける.

実験資料

資料の訂正

OCaml入門テキスト

実験指導書

演習システムの不具合

提出状況のページで解答済みの問題数が正しくカウントされません. 表示上おかしいだけで,テストや提出記録はきちんと行われているのであまり気にしないようお願いします.

演習課題の補足

OCaml演習のEx7.7

作ってほしいクラスをC++とJavaで書くと以下のようになります.解こうとしている人は参考にしてください.(CPointCgetincを再定義していないところをどうやってOCamlで実現するかがこの問題の問うているところ)

C++

class PointC {
  int x_;
public:
  PointC(int x) : x_(x) {}
  int get() { return x_; }
  virtual void set(int x) { x_ = x; }
  void inc() { set(get() + 1); }
};
enum Color { Blue, Red, Green, White };
class CPointC : public PointC {
  Color c_;
public:
  CPointC(int x, Color c) : c_(c), PointC(x) {}
  void set(int x) { PointC::set(x); c_ = White; }
  Color getcolor() { return c_; }
};

Java

class PointC {
    private int x_;
    PointC(int x) { x_ = x; }
    int get() { return x_; }
    void set(int x) { x_ = x; }
    void inc() { set(get() + 1); }
}
enum Color { Blue, Red, Green, White }
class CPointC extends PointC {
    private Color c_;
    CPointC(int x, Color c) { super(x); c_ = c; }
    void set(int x) { super.set(x); c_ = Color.White; }
    Color getcolor() { return c_; }
}

自動テストの流れ

各テストは入力のプログラムと期待される評価結果を文字列で表わしたペアで表現されています.例えば以下のような感じです.

("let x = 1 in x + 4", "5")

こういったテストケースについて以下の疑似コードで評価結果を得て.期待している評価結果と合っているかどうかをテストしています.

let buf = (* テストしたい式の文字列からlexbufを作る *) in
let rec loop buf env =
  let program = Parser.toplevel Lexer.main buf in
  match program with
  | Syntax.Exp exp -> Eval.eval_exp env exp
  | _ ->
      let (* eval_decl の返り値から new_env を取り出すパターン *) = Eval.eval_decl env program in
      loop buf new_env
in loop buf Environment.empty

赤字の関数を提出されたソースコードから引っ張ってくるので,これら以外の場所(例えば Main.read_eval_print)で評価に関係する処理を行うとテストに通らなかったりするので気をつけてください.