2

http://www.ocaml-tutorial.org/data_types_and_matchingから次のコードを取得しました

PHPコードベースから呼び出すために、次のCスタブを作成しようとしています。次の Ocaml 型 expr の 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
  ;;

どんな提案でも大きな助けになります!ありがとう!

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 値を作成するには、Creating and Modifying OCaml values を参照してください。次に例を示します。

#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

「expr」のようなタイプのドキュメントを取得できません。

マニュアルはこれを明確に述べており、例を提供しています:

n タプルを引数として宣言された非定数コンストラクタは、コンストラクタ番号でタグ付けされたサイズ n のブロックで表されます。n フィールドには、タプル引数のコンポーネントが含まれます。

たとえばMinus (e1,e2)、タグ 1 を持つサイズ 2 のブロックとして表されます。

于 2010-10-19T08:45:15.777 に答える
0

リンクのリスト:

C と OCaml のインターフェース

スタブ コード ジェネレーター。

SWIGは、ほぼすべてのものを何にでも接続できます。

モジュールと C インターフェイス。

于 2010-10-19T08:18:38.927 に答える