A: ファイルの文字コードを EUC-JP にしてください. Emacs であれば,C-x RET f euc-jp-unix としてください.
A: tuareg-mode を呼び出してから,tuareg-run-ocaml を実行してください.
座学 | 情報3講義室 |
演習 | 一階端末室 |
日付 | 締切 | 範囲 | レポート課題 |
---|---|---|---|
|
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 |
|
1/31(土) | インタプリタ作成実験 | 課題2: 必修課題・問いたオプション課題の★の数の合計が5個以上 |
|
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... で受け付ける.
提出状況のページで解答済みの問題数が正しくカウントされません. 表示上おかしいだけで,テストや提出記録はきちんと行われているのであまり気にしないようお願いします.
作ってほしいクラスをC++とJavaで書くと以下のようになります.解こうとしている人は参考にしてください.(CPointC
でget
とinc
を再定義していないところをどうやってOCamlで実現するかがこの問題の問うているところ)
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_; } };
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
)で評価に関係する処理を行うとテストに通らなかったりするので気をつけてください.