Как передать строку в OCaml из C ++ - PullRequest
0 голосов
/ 04 мая 2020

Я ничего не нашел в Google, поэтому отвечаю на свой вопрос:

Как передать строку из C ++ в OCaml?

Учитывая код C ++, как я могу вызвать код OCaml и передать эту строку?

1 Ответ

1 голос
/ 04 мая 2020

Работает и для C, просто измените инструкции по компиляции:

say_something.ml:

let say_something string = String.concat "" ["OCaml says: "; string]

let () = Callback.register "say_something" say_something

say_something. cc:

#include <stdio.h>
#include <string.h>
#include <caml/mlvalues.h>
#include <caml/callback.h>
#include <caml/alloc.h>


char *say_something(const char *s)
{
  static const value *say_something_closure = NULL;
  if (say_something_closure == NULL) {
    say_something_closure = caml_named_value("say_something");
    if (say_something_closure == NULL) {
      std::exit(1);
    }
  }

  value str = caml_alloc_initialized_string(strlen(s), s);
  /* We copy the C string returned by String_val to the C heap
     so that it remains valid after garbage collection. */
  return strdup(String_val(caml_callback(*say_something_closure, str)));
}

основной. cc:

#include <stdio.h>
#include <caml/callback.h>

extern char* say_something(const char* s);

int main(int argc, char ** argv)
{
  char* result;

  /* Initialize OCaml code */
  caml_startup(argv);
  /* Do some computation */
  result = say_something("hello world\n");
  printf("%s", result);
  return 0;
}

Как построить:

ocamlopt -output-obj -o s.o say_something.ml
g++ -o hello_world -I $(ocamlopt -where) \
    main.cc say_something.cc s.o $(ocamlopt -where)/libasmrun.a -ldl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...