2

我从http://www.ocaml-tutorial.org/data_types_and_matching获取了以下代码

我一直在尝试编写一个 C 存根,以便从我们的 PHP 代码库中调用。我不太明白我应该如何(以及是否)为以下 Ocaml 类型 expr 创建 typedef,以及如何从 C 存根访问函数 multiply_out?

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

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
  ;;

任何建议都会有很大帮助!谢谢!

4

3 回答 3

4

手册有点简洁,但这在手册中介绍。O'Reilly 的书要好一些:结构化值的表示。这是您的类型的存根:

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 值,请查看创建和修改 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);
于 2010-10-19T17:40:56.243 回答
0

链接列表:

将 C 与 OCaml 连接

存根代码生成器。

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

模块和 C 接口。

于 2010-10-19T08:18:38.927 回答
0

无法获取诸如“expr”之类的类型的文档。

手册清楚地说明了这一点并提供了一个例子:

使用 n 元组作为参数声明的非常量构造函数由大小为 n 的块表示,并标有构造函数编号;n 个字段包含其元组参数的组件。

例如Minus (e1,e2),将表示为大小为 2 且标签为 1 的块。

于 2010-10-19T08:45:15.777 回答