Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个Ocaml类型定义在其C存根中是什么样子的?_C_Linker_Ocaml_Stub - Fatal编程技术网

这个Ocaml类型定义在其C存根中是什么样子的?

这个Ocaml类型定义在其C存根中是什么样子的?,c,linker,ocaml,stub,C,Linker,Ocaml,Stub,我从中获取了以下代码 我一直在尝试编写一个C存根,以便从PHP代码库中调用。我不太明白如何(如果)为下面的Ocaml类型表达式创建一个typedef,以及如何从C存根访问函数multiply_out 我是Ocaml的新手,我们正在评估它,看看它是否对我们为数学web应用程序创建一个小语法有用 type expr = Plus of expr * expr (* means a + b *) | Minus of expr * expr (* mean

我从中获取了以下代码

我一直在尝试编写一个C存根,以便从PHP代码库中调用。我不太明白如何(如果)为下面的Ocaml类型表达式创建一个typedef,以及如何从C存根访问函数multiply_out

我是Ocaml的新手,我们正在评估它,看看它是否对我们为数学web应用程序创建一个小语法有用

type expr = Plus of expr * expr        (* means a + b *)
          | Minus of expr * expr       (* means a - b *)
          | Times of expr * expr       (* means a * b *)
          | Divide of expr * expr      (* means a / b *)
          | Value of string            (* "x", "y", "n", etc. *)
          ;;

let rec multiply_out e =
  match e with
    Times (e1, Plus (e2, e3)) ->
      Plus (Times (multiply_out e1, multiply_out e2),
            Times (multiply_out e1, multiply_out e3))
  | Times (Plus (e1, e2), e3) ->
      Plus (Times (multiply_out e1, multiply_out e3),
            Times (multiply_out e2, multiply_out e3))
  | Plus (left, right) -> Plus (multiply_out left, multiply_out right)
  | Minus (left, right) -> Minus (multiply_out left, multiply_out right)
  | Times (left, right) -> Times (multiply_out left, multiply_out right)
  | Divide (left, right) -> Divide (multiply_out left, multiply_out right)
  | Value v -> Value v
  ;;
任何建议都会大有帮助! 谢谢

链接列表:

几乎可以将任何东西连接到任何东西

无法获取“expr”类型的文档

手册对此进行了明确说明,并提供了一个示例:

声明的非常量构造函数 以n元组作为参数的 由大小为n的块表示, 标有建造商编号; n个字段包含 它的元组参数


例如,
减号(e1,e2)
将表示为带有标记1的大小为2的块。

本手册有点简洁,但本手册对此进行了介绍。奥莱利的书好一点。这是您的类型的存根:

int tag = Tag_val(v);
const char *lookup[4] = {"plus", "minus", "times", "divide"};
if(tag == 5) // Value
{
  char *val = String_val(Field(v, 0));
}
else
{
  value expr1 = Field(v, 0);
  value expr2 = Field(v, 1);
  const char *operation = lookup[tag-1];
}
要在C中构建OCaml值,请签出。下面是一个例子:

#define MINUS 2
#define VALUE 5
value two, five, minus;
CAMLlocal3(two, five, minus);
five = alloc(1, VALUE);
two = alloc(1, VALUE);
Store_field(copy_string("5"), 0, five);
Store_field(copy_string("2"), 0, two);
minus = alloc(2, MINUS); // allocate a block that contains two "words", tagged 2 (MINUX)
Store_field(minus, 0, five); // store five in the zeroith field of minus
Store_field(minus, 1, two); // store two in the first field of minus
CAMLreturn(minus);

谢谢克拉克的回复。夫妇追踪Qs。我已经浏览了第一个链接(和),以了解如何从C调用Ocaml。它适用于简单类型。无法获取“expr”类型的文档。卡姆利德尔会为我们工作吗?我们希望在UNIX平台上从C调用Ocaml。我假设SWIG稍后会出现,PHP调用C,而不是帮助C调用Ocaml,是吗?@Sid,我真的不知道,我不知道Ocaml。也许您可以在单独的过程中启动Ocaml,并通过套接字或管道进行通信?这不是答案,而是一个想法……下面的链接是关于C和Ocaml接口的各种情况的重要资源@感谢你的链接,我还没有看到这个,它真的很有帮助。我仍然有点困惑,反向工程Niki在下面的回复,在C中雕刻并发送一个“减号(e1,e2)”并发送给Ocaml,无法找出Val_标签的替代品,如果有一个tag_Val,我假设它们是Val_标签。谢谢非常感谢。您是否建议在C中为“减号(e1,e2)”创建一个字符串,并使用ocamlex/Ocamlyacc来匹配Ocaml中的“expr”类型?还有更好的方法吗?我非常感谢你的努力Niki。我仍然无法理解如何用C写“减号(e1,e2)”并将其发送给Ocaml进行处理。我知道我可以使用您编写的上述代码来读取响应,但我一直在琢磨如何雕刻C->Ocaml输入。@Sid-检查我的编辑。基本上,您使用了
alloc
Store\u field
@Niki感谢您的新回复。这是有道理的。我现在正与seg故障作斗争,但你的回答已经消除了我最初的疑虑。再次感谢。@Sid-检查我的新编辑。我忘了处理垃圾收集器。您需要告诉OCaml您正在使用
camlocal
分配内存,然后使用
CAMLreturn
。这可能就是导致SEGFULT的原因。OCaml标记值不是从0分配的吗?所以
应该是1,而
值应该是4。