Как это определение типа Ocaml будет выглядеть в своей заглушке C? - PullRequest
2 голосов
/ 19 октября 2010

Я взял следующий код из http://www.ocaml -tutorial.org / data_types_and_matching

Я пытался написать заглушку C для последующего вызова из нашего PHPкодовая.Я не совсем понимаю, как (и если) я должен создать typedef для следующего выражения типа Ocaml, и как я могу получить доступ к функции multiply_out из заглушки C?

Я новичокдля 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
  ;;

Любые предложения окажут большую помощь!Спасибо!

Ответы [ 3 ]

4 голосов
/ 19 октября 2010

Руководство немного лаконично, но это описано в руководстве. Книга О'Рейли немного лучше: Представление структурированных значений . Вот заглушка для вашего типа:

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

Чтобы построить значение OCaml в 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);
0 голосов
/ 19 октября 2010

Не удалось получить документацию для типа, подобного "expr".

В руководстве это четко изложено и приводится пример:

Константные конструкторы, объявленные с n-кортежем в качестве аргумента, представлены блоком размера n, помеченнымномер конструктора;n полей содержат компоненты аргумента кортежа.

Например, Minus (e1,e2) будет представлен как блок размера 2 с тегом 1.

0 голосов
/ 19 октября 2010

Список ссылок:

Интерфейс C с OCaml

Генератор кодовых заглушек.

SWIG может подключить практически все к чему угодно.

Модули и интерфейс C.

...