我正在尝试写一个脚本来评分用OCaml写的家庭作业。我有两个文件,homework.ml和testRunner.ml。homework.ml的功能由学生按照家庭作业的要求用名字实现。就像。假设学生被要求实现一个函数,该函数计算函数名为square的数字的平方。如果学生不知道答案,他可以跳过写函数。
我的testRunner.ml可以从homework.ml运行函数,但是如果学生运行而不是,则会失败,在本例中,该函数的实现是对Unbound value square的抱怨。
在调用函数之前,OCaml中有检查函数是否存在的方法吗?我试图将函数调用包装在一个try...with中,但结果仍然不起作用。
print_string "my_function [] 5 = ";
try
print_endline (string_of_int (my_function [] 5)); (* This fails because the student did not write the my_function function *)
with _ -> print_string "Error";;很抱歉,如果已经有人问过这个问题,我找不到。
发布于 2019-09-26 22:52:58
OCaml中的函数是静态的,这意味着函数名称必须在编译时引用特定的实现。
因此,最简单的解决方案是为学生提供一个homework.ml文件,该文件为每个需要实现的函数提供默认实现。这也可以包括将任务描述为与每个职能相关的评论。例如:
(* (Optional) Implement a function [square] which squares the integer [x] *)
let square x =
failwith "not implemented"但是,您也可以在testRunner.ml中提供默认实现,并在它们之后包含homework.ml的内容。如果没有在那里定义square,那么它将返回到先前定义的默认实现,如果定义了它,则学生的实现将隐藏默认值。出于沙箱的目的,在子模块中这样做也是一个好主意:
module H = struct
let square _ =
failwith "not implemented"
include Homework (* This will essentially include the contents of homework.ml at this point *)
end
let () =
print_string "square 5 = ";
try
print_endline (string_of_int (H.square 5))
with
_ -> print_string "Error"https://stackoverflow.com/questions/58125463
复制相似问题