caml_hash_varian return 值在什么范围内?
In what range does caml_hash_varian return values?
子章节“20.3.6 Polymorphic variants”描述了如何在 C 中识别多态变体值(*它包含一个错误:应该是 caml_hash_variant
而不是 hash_variant
)
我想直接使用这些散列值作为 C++ 中的错误代码。类似的东西
archive.mli:
...
type t = ...
type err = [`File_not_found | `Archive_is_corrupted]
val opena : string -> (t, err) error
...
archive.ml
...
let () = Callback.register "open archive" opena
...
archive.cpp:
...
const int Error::File_not_found = caml_hash_variant("File_not_found")
const int Error::Archive_is_corrupted = caml_hash_variant("Archive_is_corrupted")
int Archive::open(char* path) {
static const value* f = nullptr; \
if (f = nullptr)
f = caml_named_value("open archive");
value result = caml_callback(*f, caml_copy_string(path));
if (Tag_val(result) == 0) { // Result.Ok
archive = Field(caml_state, 0);
return ??????
} else { // Result.Error
return Int_val(Field(caml_state, 0));
}
}
...
到return错误码比较没有问题
if (x.open(path) == Error::Archive_is_corrupted) {
...
}
但我不知道我可以 return 作为 OK 状态。 0? -1?
caml_hash_variant
不能return的保证值是否存在?
通常的 OCaml 实现中的立即值设置了低位,并且变体哈希是立即值。因此,如果您正在查看 C++ 中的变体哈希值,您可以确定 caml_hash_variant.
永远不会返回值 0
如果您查看代码,最终值是由 Val_int() 或 Val_long() 生成的。在这些宏的定义中,您会看到它们保证设置了低位。
我没有对代码进行任何类型的分析,但值 -1 至少从表面上看可以作为哈希值,因为它的低位已设置。
更新
立即数的低位设置为垃圾收集器的标记。所以这是一个必须严格遵守的约定。 (恕我直言,这是 OCaml 实现中许多非常好的设计权衡之一。)
子章节“20.3.6 Polymorphic variants”描述了如何在 C 中识别多态变体值(*它包含一个错误:应该是 caml_hash_variant
而不是 hash_variant
)
我想直接使用这些散列值作为 C++ 中的错误代码。类似的东西
archive.mli:
...
type t = ...
type err = [`File_not_found | `Archive_is_corrupted]
val opena : string -> (t, err) error
...
archive.ml
...
let () = Callback.register "open archive" opena
...
archive.cpp:
...
const int Error::File_not_found = caml_hash_variant("File_not_found")
const int Error::Archive_is_corrupted = caml_hash_variant("Archive_is_corrupted")
int Archive::open(char* path) {
static const value* f = nullptr; \
if (f = nullptr)
f = caml_named_value("open archive");
value result = caml_callback(*f, caml_copy_string(path));
if (Tag_val(result) == 0) { // Result.Ok
archive = Field(caml_state, 0);
return ??????
} else { // Result.Error
return Int_val(Field(caml_state, 0));
}
}
...
到return错误码比较没有问题
if (x.open(path) == Error::Archive_is_corrupted) {
...
}
但我不知道我可以 return 作为 OK 状态。 0? -1?
caml_hash_variant
不能return的保证值是否存在?
通常的 OCaml 实现中的立即值设置了低位,并且变体哈希是立即值。因此,如果您正在查看 C++ 中的变体哈希值,您可以确定 caml_hash_variant.
永远不会返回值 0如果您查看代码,最终值是由 Val_int() 或 Val_long() 生成的。在这些宏的定义中,您会看到它们保证设置了低位。
我没有对代码进行任何类型的分析,但值 -1 至少从表面上看可以作为哈希值,因为它的低位已设置。
更新
立即数的低位设置为垃圾收集器的标记。所以这是一个必须严格遵守的约定。 (恕我直言,这是 OCaml 实现中许多非常好的设计权衡之一。)