OCaml中的静态(编译时)断言? > OCAM中是否有这样的设施(例如,类似于C++和D)? 例如,当我定义我的函数时: let my_func arg1 arg2 = static_assert (arg1 < arg2); (* rest of the function's body *)

OCaml中的静态(编译时)断言? > OCAM中是否有这样的设施(例如,类似于C++和D)? 例如,当我定义我的函数时: let my_func arg1 arg2 = static_assert (arg1 < arg2); (* rest of the function's body *),ocaml,Ocaml,我会在编译时得到断言失败吗 如果OCaml中没有此类设施,是否可以与其他现有设施一起实施?目前还没有 OCaml编译器所做的唯一静态检查是类型(这将允许您轻松地消除在求和类型上可能发生的许多错误)。通过不断传播,您的测试可以静态地转换为立即引发的异常,因此,在这种情况下,可能可以对编译器进行修补以打印警告(而不是简单的修补IMHO) 虽然有一些工具可以帮助您查找代码中的错误,但您可以查看caml列表,其中引用了当前可用的OCaml帮助工具。静态断言源于您指定的语言类型系统的不足。OCaml已经检

我会在编译时得到断言失败吗


如果OCaml中没有此类设施,是否可以与其他现有设施一起实施?

目前还没有

OCaml编译器所做的唯一静态检查是类型(这将允许您轻松地消除在求和类型上可能发生的许多错误)。通过不断传播,您的测试可以静态地转换为立即引发的异常,因此,在这种情况下,可能可以对编译器进行修补以打印警告(而不是简单的修补IMHO)


虽然有一些工具可以帮助您查找代码中的错误,但您可以查看caml列表,其中引用了当前可用的OCaml帮助工具。

静态断言源于您指定的语言类型系统的不足。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

你不能用C++中的<代码> StasyAsAsdit< /Cuff>那样做。对 StistaSypRe> <代码>的表达式需要编译时常数。我想知道C++是如何做到的。这解释了很多。在这种情况下,它可以通过一些语法扩展来实现。您确定常量传播和即时异常吗?优化不会改变语义,在“其他地方”引发异常肯定是一种改变。我认为PatJ的意思是,您可以在语言中添加一个
static\u assert
关键字,如果表达式可以减少为常量,而该常量为
false
,则会触发编译失败,或者,如果这个表达不能简化,那确实是我的意思。还要注意,@unix beard没有指定他想要的行为,以防他的
static\u断言将是死代码。
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