OCaml中是否有这样的设施(例如,类似于C ++和D)? 例如,当我定义我的函数时:
let my_func arg1 arg2 =
static_assert (arg1 < arg2);
(* rest of the function's body *)
并尝试稍后调用它:
my_func 4 1
我会在编译时断言失败吗?
如果OCaml中没有这样的设施,是否可以与其他现有设施一起实施?
答案 0 :(得分:1)
截至目前,还没有。
OCaml编译器执行的唯一静态检查是输入(这将使您轻松摆脱可以对和类型执行的许多错误)。通过不断传播,您的测试可以静态转换为立即异常提升,因此也许可以修补编译器在这种情况下打印警告(不是一个简单的补丁恕我直言)。
有一些工具可以帮助您在代码中找到错误,您可以在caml-list上查看that post,引用当前可用的OCaml帮助工具。
答案 1 :(得分:1)
静态断言来自您指定语言的类型系统的不足。 OCaml已经检查了可以用其类型系统表达的所有内容。如果某些东西可以在编译时证明是不合理的,那么OCaml会说明这一点。
但是,在OCaml中,您仍然可以添加一些不会影响运行时的检查,但会允许您验证未经静态验证的额外属性和不变量。 Janestreet提供了一个pa_test
库,允许您将测试内联到模块中,并将其作为编译过程的一部分运行。不是真正的静态断言,但仍然在编译时(至少从观察者的角度来看)。看起来像这样:
TEST_MODULE = struct
let str = "hello\000,\000world\000!\000"
let pos_ref = ref 0
TEST = read_cstring str ~pos_ref = Ok "hello"
TEST = read_cstring str ~pos_ref = Ok ","
TEST = read_cstring str ~pos_ref = Ok "world"
TEST = read_cstring str ~pos_ref = Ok "!"
TEST = String.length str = pos_ref.contents
end