open Mp11common let rubric_version = "1.0" let rubric_title = "CS421 Fasll 2012 MP1" (************************************************************************** * You can add new test cases by adding new elements to the following lists * Format is: * TESTARG(, , , , ..., ) * * is the number of argument that the function being tested takes. **************************************************************************) let parse s = Micromlparse.main Micromllex.token (Lexing.from_string s) let rec eval_exp_cps env ecps = match Solution.one_step_exp_cps_eval env ecps with Intermediate(env1, ecps1) -> (Intermediate(env1, ecps1))::(eval_exp_cps env1 ecps1) | result -> [result] (* We finished or died *) let rec eval_exp_cps_stu env ecps = match Student.one_step_exp_cps_eval env ecps with Intermediate(env1, ecps1) -> (Intermediate(env1, ecps1))::(eval_exp_cps env1 ecps1) | result -> [result] (* We finished or died *) let rubric = [ (* Problem 1, 12 pts *) TEST3ARG(1, app_cont_to_value, [], External, (IntVal 6)); TEST3ARG(1, app_cont_to_value, [ContBinding(1,(ContCPS("c",ConstCPS(External, IntConst 3)),[]))], External, (RealVal 6.0)); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",StringVal "hi")], (ContCPS("b",BinOpAppCPS(External, ConcatOp, "a", "b", ExnContVarCPS 0))), (StringVal " there")); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 3); ContBinding (4,(ContCPS("b",ConstCPS(External, IntConst 3)),[]))], (ContVarCPS 4), UnitVal); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 3); ContBinding (4,(ContCPS("b",ConstCPS(External, IntConst 3)),[]))], (ContVarCPS 3), (BoolVal true)); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 3)], (ExnMatch EmptyExnContCPS), (IntVal 3)); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 3)], (ExnMatch (UpdateExnContCSP ([(Some 2, VarCPS(External, "a")); (Some 3, ConstCPS(ContCPS("b",VarCPS(External,"b")),StringConst "bye"))], EmptyExnContCPS))), (IntVal 3)); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 3)], (ExnMatch (UpdateExnContCSP ([(Some 1, ConstCPS(ContCPS("b", VarCPS(External, "b")),StringConst "hi")); (None, VarCPS(External, "a")); (Some 3, ConstCPS(ContCPS("c", VarCPS(External, "c")),UnitConst))], EmptyExnContCPS))), (IntVal 3)); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 3)], (ExnMatch (UpdateExnContCSP ([(Some 3, ConstCPS(ContCPS("b", VarCPS(External, "b")),StringConst "hi")); (None, VarCPS(External, "a")); (Some 2, ConstCPS(ContCPS("c", VarCPS(External, "c")),NilConst))], EmptyExnContCPS))), (IntVal 3)); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 3)], (ExnMatch (UpdateExnContCSP ([(Some 3, ConstCPS(ContCPS("b", VarCPS(External, "b")),StringConst "hi")); (Some 2, ConstCPS(ContCPS("c", VarCPS(External, "c")),NilConst))], EmptyExnContCPS))), (IntVal 7)); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 3)], (ExnMatch (UpdateExnContCSP ([(Some 3, ConstCPS(ContCPS("b", VarCPS(External, "b")),StringConst "hi"))], UpdateExnContCSP ([(Some 2, ConstCPS(ContCPS("c", VarCPS(External, "c")),NilConst))], EmptyExnContCPS)))), (IntVal 2)); TEST3ARG(1, app_cont_to_value, [ValueBinding ("a",IntVal 6); ExnContBinding(4, (UpdateExnContCSP ([(Some 2, VarCPS(External, "a"))], ExnContVarCPS 7), [ExnContBinding(7,(UpdateExnContCSP ([(Some 3, ConstCPS(ContCPS("b",VarCPS(External,"b")), StringConst "bye"))], EmptyExnContCPS),[]))]))], (ExnMatch (ExnContVarCPS 4)), (IntVal 3)); (* Problem 2, 2 pts *) TEST2ARG(1, one_step_exp_cps_eval, [], (ConstCPS(External, IntConst 2))); TEST2ARG(1, one_step_exp_cps_eval, [], (ConstCPS(ContCPS("z",VarCPS(External,"z")), IntConst 2))); (* Problem 3, 3 pts *) TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("x", IntVal 2)], (VarCPS(External, "x"))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("x", IntVal 2)], (VarCPS(ContCPS("z",VarCPS(External,"z")), "x"))); TEST2ARG(1, one_step_exp_cps_eval, [], (VarCPS(External, "x"))); (* Problem 4, 7 pts *) TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("x", IntVal 2)], (MonOpAppCPS(External, IntNegOp, "x", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [], (MonOpAppCPS(External, IntNegOp, "x", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("x", IntVal 2)], (MonOpAppCPS(ContCPS("z",VarCPS(External,"z")), IntNegOp, "x", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("x", ListVal [])], (MonOpAppCPS(External, HdOp, "x", UpdateExnContCSP([(Some 0, ConstCPS(External,IntConst 20))], EmptyExnContCPS)))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("x", ListVal [])], (MonOpAppCPS(ContCPS("z",VarCPS(External,"z")), TlOp, "x", UpdateExnContCSP([(Some 0, ConstCPS(External,IntConst 20))], EmptyExnContCPS)))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("x", ListVal [])], (MonOpAppCPS(External, HdOp, "x", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("x", ListVal [])], (MonOpAppCPS(External, TlOp, "x", UpdateExnContCSP([(Some 0, ConstCPS(ContCPS("z",VarCPS(External,"z")), NilConst))], EmptyExnContCPS)))); (* Problem 5, 8 pts *) TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("b", IntVal 3);ValueBinding("a", IntVal 2)], (BinOpAppCPS(External, IntPlusOp, "a", "b", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("b", IntVal 3)], (BinOpAppCPS(External, IntPlusOp, "a", "b", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("a", IntVal 2)], (BinOpAppCPS(External, IntPlusOp, "a", "b", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("b", IntVal 3);ValueBinding("a", IntVal 2)], (BinOpAppCPS(ContCPS("z",VarCPS(External,"z")), IntPlusOp, "a", "b", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("d", IntVal 0);ValueBinding("c", IntVal 2)], (BinOpAppCPS(External, IntDivOp, "c", "d", UpdateExnContCSP([(Some 0, ConstCPS(External,IntConst 20))], EmptyExnContCPS)))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("d", IntVal 0);ValueBinding("c", IntVal 2)], (BinOpAppCPS(ContCPS("z",VarCPS(External,"z")), IntDivOp, "c", "d", UpdateExnContCSP([(Some 0, ConstCPS(External,IntConst 20))], EmptyExnContCPS)))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("d", RealVal 0.0);ValueBinding("c", RealVal 2.3)], (BinOpAppCPS(ContCPS("z",VarCPS(External,"z")), RealDivOp, "c", "d", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("d", RealVal 0.0);ValueBinding("c", RealVal 2.3)], (BinOpAppCPS(External, RealDivOp, "c", "d", UpdateExnContCSP([(Some 0, ConstCPS(ContCPS("z",VarCPS(External,"z")), RealConst 4.5))], EmptyExnContCPS)))); (* Problem 6, 5 pts *) TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("a", BoolVal true)], (IfCPS("a", ConstCPS(External,IntConst 1), ConstCPS(External,IntConst 0)))); TEST2ARG(1, one_step_exp_cps_eval, [], (IfCPS("a", ConstCPS(External,IntConst 1), ConstCPS(External,IntConst 0)))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("a", BoolVal true)], (IfCPS("a", ConstCPS(ContCPS("z",VarCPS(External,"z")),StringConst "splat"), ConstCPS(ContCPS("z",ConstCPS(External, StringConst "plop")), StringConst "flop")))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("a", BoolVal false)], (IfCPS("a", ConstCPS(External,IntConst 1), ConstCPS(External,IntConst 0)))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("a", BoolVal false)], (IfCPS("a", ConstCPS(ContCPS("z",VarCPS(External,"z")),StringConst "splat"), ConstCPS(ContCPS("z",ConstCPS(External, StringConst "plop")), StringConst "flop")))); (* Problem 7, 3 pts *) TEST2ARG(1, one_step_exp_cps_eval, [], (FnCPS (External, "x", 1, 0, VarCPS (ContCPS ("a", ConstCPS (ContCPS ("b", BinOpAppCPS (ContVarCPS 1, IntPlusOp, "a", "b", ExnContVarCPS 0)), IntConst 5)), "x")))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("y", BoolVal false)], (FnCPS (ContCPS("z",VarCPS(External,"z")), "x", 1, 0, VarCPS (ContCPS ("a", ConstCPS (ContCPS ("b", BinOpAppCPS (ContVarCPS 1, IntPlusOp, "a", "b", ExnContVarCPS 0)), IntConst 5)), "x")))); TEST2ARG(1, one_step_exp_cps_eval, [ ValueBinding("x", BoolVal false)], (FnCPS (External, "x", 1, 0, VarCPS (ContCPS ("a", ConstCPS (ContCPS ("b", BinOpAppCPS (ContVarCPS 1, IntPlusOp, "a", "b", ExnContVarCPS 0)), IntConst 5)), "x")))); (* Problem 8, 3 pts *) TEST2ARG(1, one_step_exp_cps_eval, [], (cps_dec (parse "val rec f n = if n = 0 then 1 else f (n - 1);") (VarCPS(External, "f")) EmptyExnContCPS)); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("y", IntVal 3)], (cps_dec (parse "val rec even n = if n = 0 then true else if n = 1 then false else (even (n - 2));") (VarCPS(External, "even")) EmptyExnContCPS)); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("y", IntVal 3)], (cps_dec (parse "val rec even n = if n = 0 then true else if n = 1 then false else (even (n - 2));") (VarCPS(ContCPS("z",VarCPS(External,"z")), "even")) EmptyExnContCPS)); (* Problem 9, 10 pts *) TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("plus5", (CPSClosureVal ("x", 1, 0, VarCPS (ContCPS ("a", ConstCPS (ContCPS ("b", BinOpAppCPS (ContVarCPS 1, IntPlusOp, "a", "b", ExnContVarCPS 0)), IntConst 5)), "x"), []))); ValueBinding("c",IntVal 2)], (AppCPS(External, "plus5", "c", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("c",IntVal 2)], (AppCPS(External, "plus5", "c", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("plus5", (CPSClosureVal ("x", 1, 0, VarCPS (ContCPS ("a", ConstCPS (ContCPS ("b", BinOpAppCPS (ContVarCPS 1, IntPlusOp, "a", "b", ExnContVarCPS 0)), IntConst 5)), "x"), [])))], (AppCPS(External, "plus5", "c", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("even", (CPSRecClosureVal ("even", "n", 1, 0, VarCPS (ContCPS ("8", ConstCPS (ContCPS ("9", BinOpAppCPS (ContCPS ("0", IfCPS ("0", ConstCPS (ContVarCPS 1, BoolConst true), VarCPS (ContCPS ("6", ConstCPS (ContCPS ("7", BinOpAppCPS (ContCPS ("1", IfCPS ("1", ConstCPS (ContVarCPS 1, BoolConst false), VarCPS (ContCPS ("2", VarCPS (ContCPS ("4", ConstCPS (ContCPS ("5", BinOpAppCPS (ContCPS ("3", AppCPS (ContVarCPS 1, "2", "3", ExnContVarCPS 0)), IntMinusOp, "4", "5", ExnContVarCPS 0)), IntConst 2)), "n")), "even"))), EqOp, "6", "7", ExnContVarCPS 0)), IntConst 1)), "n"))), EqOp, "8", "9", ExnContVarCPS 0)), IntConst 0)), "n"), []))); ValueBinding ("a", IntVal 3)], (AppCPS(External, "even", "a", EmptyExnContCPS))); TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("even", (CPSRecClosureVal ("even", "n", 1, 0, VarCPS (ContCPS ("8", ConstCPS (ContCPS ("9", BinOpAppCPS (ContCPS ("0", IfCPS ("0", ConstCPS (ContVarCPS 1, BoolConst true), VarCPS (ContCPS ("6", ConstCPS (ContCPS ("7", BinOpAppCPS (ContCPS ("1", IfCPS ("1", ConstCPS (ContVarCPS 1, BoolConst false), VarCPS (ContCPS ("2", VarCPS (ContCPS ("4", ConstCPS (ContCPS ("5", BinOpAppCPS (ContCPS ("3", AppCPS (ContVarCPS 1, "2", "3", ExnContVarCPS 0)), IntMinusOp, "4", "5", ExnContVarCPS 0)), IntConst 2)), "n")), "even"))), EqOp, "6", "7", ExnContVarCPS 0)), IntConst 1)), "n"))), EqOp, "8", "9", ExnContVarCPS 0)), IntConst 0)), "n"), [])))], (AppCPS(External, "even", "a", EmptyExnContCPS))) ; TEST2ARG(1, one_step_exp_cps_eval, [ValueBinding("f", (CPSRecClosureVal ("even", "n", 1, 0, VarCPS (ContCPS ("8", ConstCPS (ContCPS ("9", BinOpAppCPS (ContCPS ("0", IfCPS ("0", ConstCPS (ContVarCPS 1, BoolConst true), VarCPS (ContCPS ("6", ConstCPS (ContCPS ("7", BinOpAppCPS (ContCPS ("1", IfCPS ("1", ConstCPS (ContVarCPS 1, BoolConst false), VarCPS (ContCPS ("2", VarCPS (ContCPS ("4", ConstCPS (ContCPS ("5", BinOpAppCPS (ContCPS ("3", AppCPS (ContVarCPS 1, "2", "3", ExnContVarCPS 0)), IntMinusOp, "4", "5", ExnContVarCPS 0)), IntConst 2)), "n")), "even"))), EqOp, "6", "7", ExnContVarCPS 0)), IntConst 1)), "n"))), EqOp, "8", "9", ExnContVarCPS 0)), IntConst 0)), "n"), []))); ValueBinding ("a", IntVal 3)], (AppCPS(External, "f", "a", EmptyExnContCPS))); TEST2ARG_TWOFUN(4, eval_exp_cps, eval_exp_cps_stu, [], (cps_dec (parse "val not = fn b => if b then false else true val rec div_aux n = (fn l => if l = [] then n else if hd l = 0 then raise 5 else (div_aux n (tl l)) / (hd l)) val div_by_list = fn m => fn lst => ((div_aux m lst) handle 5 => 0);") (cps_dec (parse "val result = (div_by_list 6 [3, 2], div_by_list 6 [3, 0, 2]);") (VarCPS(External, "result")) EmptyExnContCPS) EmptyExnContCPS)) ] (* This list is for extra credit problems *) let extra_rubric = []