gpt4 book ai didi

c - C 中的 OCaml 类型构造函数 =

转载 作者:行者123 更新时间:2023-12-04 14:46:12 24 4
gpt4 key购买 nike

我已经为一些 C 代码编写了一些 OCaml 绑定(bind);它们似乎工作正常,除了在解释器中,类型构造函数对 OCaml 而言似乎是不透明的。所以,例如:

# #load "foo.cma" ;;
# open Foo ;;
# let b = barbie "bar";;
val b : Foo.kung = <unknown constructor>
# let k = ken "kenny" ;;
val k : Foo.tza = <abstr>

我正试图摆脱 <unknown constructor>并用有意义的打印替换它。

foo.ml的内容是:

type kung = Tsau of string [@@boxed] ;;
type tza ;; (* Obviously, an abstract type *)

external barbie : string -> kung = "barbie_doll" ;;
external ken : string -> tza = "ken_doll" ;;

C 代码是实现此功能的最少代码:

CAMLprim value barbie(value vstr) { ... }
CAMLprim value ken(value vsttr) { ... }

实际的C代码使用caml_alloc_custom()拿东西;显然必须返回什么 caml_alloc_custom()分配,这样它就不会丢失。这是使用自定义类型的核心原因:这样我就可以返回自定义 malloc。

尽管这些类型是抽象的或不透明的,但我还是想要 let expression 打印一些有意义的东西。例如,也许这个?

val b : Foo.kung = "Hi my name is bar"
val k : Foo.tza = "Yo duude it's kenny"

第二个问题是:如果可以打印一些有意义的东西,它应该是什么?显然,构造函数是用字符串调用的,所以无论打印什么都应该包括那些字符串值...

第三个问题是:在C中是否可以指定类型和类型构造函数?我怀疑答案是否定的,因为 OCaml 类型是静态的、编译时类型,并且不可动态构造。但问问总不会有坏处。我的意思是,ocaml解释器能够很好地处理全新的类型声明,所以不知何故,OCaml 类型并不是完全静态的;他们有某种“动态”的方面。我没有找到任何关于此的文档。

最佳答案

正如评论中所建议的那样,答案是使用 #install_printertoplevel documentation 中对此进行了简要介绍。 .这只是一个提示:示例代码如下(与前面的示例保持一致)。

foostubs.ml 中:

(** Signature declarations for C functions *)
external kung_prt : kung -> string = "c_kung_str" ;;

(* Need to #install_printer kung_pretty ;;
* FYI, the OCaml documentation is confusing
* as to what a Format.formatter actually is:
* it is used like a C stream or outport. *)
let kung_pretty : Format.formatter -> kung -> unit =
function oport ->
fun x -> Format.fprintf oport "Hi %s" (kung_prt x) ;;

C 中的打印机看起来像这样:

CAMLprim value c_kung_str(value vkung)
{
CAMLparam1(vkung);
const char* name = String_val(vkung);
char buff[200];
strcpy(buff, "my name is ");
strncat(buff, name, 200);
CAMLreturn(caml_copy_string(buff));
}

然后,您必须告诉用户 #install_printer kung_pretty ;; 或者,更好的是,为用户提供执行此操作的 setupfoo.ml,并且告诉他们 #use "setupfoo.ml"

关于c - C 中的 OCaml 类型构造函数 = <unknown constructor>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69996254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com