OCaml 中的静态(编译时)断言?
Static (compile-time) assert in OCaml?
OCaml 中是否有这样的工具(例如,类似于 C++ 和 D)?
例如,当我定义函数时:
let my_func arg1 arg2 =
static_assert (arg1 < arg2);
(* rest of the function's body *)
稍后尝试这样调用它:
my_func 4 1
我会在编译时断言失败吗?
如果 OCaml 中没有这样的工具,是否可以使用其他现有工具来实现它?
目前还没有。
OCaml 编译器完成的唯一静态检查是类型检查(这将允许您轻松摆脱很多在 sum 类型上可能犯的错误)。通过不断传播,您的测试可以静态地转换为立即引发异常,因此也许可以修补编译器以在这种情况下打印警告(恕我直言,这不是一个简单的修补程序)。
虽然有一些工具可以帮助您查找代码中的错误,但您可以查看 caml-list 上的 that post,参考当前可用的 OCaml 帮助工具。
静态断言来自您所指定语言的类型系统的缺陷。 OCaml 已经检查了所有可能用其类型系统表达的东西。如果某些东西可以在编译时被证明是不可靠的,OCaml 会说明这一点。
但是,在 OCaml 中您仍然可以添加一些检查,这不会影响 运行时间,但可以让您验证额外的属性和不变量,这些属性和不变量不是静态验证的。 Janestreet 提供了一个 pa_test
库,允许您将测试内联到您的模块中,并 运行 它们作为编译过程的一部分。不是真正的静态断言,但仍在编译时(至少从观察者的角度来看)。看起来像这样:
TEST_MODULE = struct
let str = "hello[=10=]0,[=10=]0world[=10=]0![=10=]0"
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
OCaml 中是否有这样的工具(例如,类似于 C++ 和 D)?
例如,当我定义函数时:
let my_func arg1 arg2 =
static_assert (arg1 < arg2);
(* rest of the function's body *)
稍后尝试这样调用它:
my_func 4 1
我会在编译时断言失败吗?
如果 OCaml 中没有这样的工具,是否可以使用其他现有工具来实现它?
目前还没有。
OCaml 编译器完成的唯一静态检查是类型检查(这将允许您轻松摆脱很多在 sum 类型上可能犯的错误)。通过不断传播,您的测试可以静态地转换为立即引发异常,因此也许可以修补编译器以在这种情况下打印警告(恕我直言,这不是一个简单的修补程序)。
虽然有一些工具可以帮助您查找代码中的错误,但您可以查看 caml-list 上的 that post,参考当前可用的 OCaml 帮助工具。
静态断言来自您所指定语言的类型系统的缺陷。 OCaml 已经检查了所有可能用其类型系统表达的东西。如果某些东西可以在编译时被证明是不可靠的,OCaml 会说明这一点。
但是,在 OCaml 中您仍然可以添加一些检查,这不会影响 运行时间,但可以让您验证额外的属性和不变量,这些属性和不变量不是静态验证的。 Janestreet 提供了一个 pa_test
库,允许您将测试内联到您的模块中,并 运行 它们作为编译过程的一部分。不是真正的静态断言,但仍在编译时(至少从观察者的角度来看)。看起来像这样:
TEST_MODULE = struct
let str = "hello[=10=]0,[=10=]0world[=10=]0![=10=]0"
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