Use another language to call a function: Difference between revisions
Content added Content deleted
(→Tcl: Added implementation) |
(added ocaml) |
||
Line 65: | Line 65: | ||
Here am I |
Here am I |
||
</pre> |
</pre> |
||
=={{header|OCaml}}== |
|||
<lang C>#include <stdio.h> |
|||
#include <string.h> |
|||
#include <caml/mlvalues.h> |
|||
#include <caml/callback.h> |
|||
extern int Query (char * Data, size_t * Length) |
|||
{ |
|||
static value * closure_f = NULL; |
|||
if (closure_f == NULL) { |
|||
closure_f = caml_named_value("Query function cb"); |
|||
} |
|||
value ret = caml_callback(*closure_f, Val_unit); |
|||
*Length = Int_val(Field(ret, 1)); |
|||
strncpy(Data, String_val(Field(ret, 0)), *Length); |
|||
return 1; |
|||
} |
|||
int main (int argc, char * argv []) |
|||
{ |
|||
char Buffer [1024]; |
|||
unsigned Size = 0; |
|||
caml_main(argv); /* added from the original main */ |
|||
if (0 == Query (Buffer, &Size)) |
|||
{ |
|||
printf ("failed to call Query\n"); |
|||
} |
|||
else |
|||
{ |
|||
char * Ptr = Buffer; |
|||
printf("size: %d\n", Size); |
|||
while (Size-- > 0) putchar (*Ptr++); |
|||
putchar ('\n'); |
|||
} |
|||
}</lang> |
|||
<lang ocaml>let caml_query () = |
|||
let s = "Here am I" in |
|||
(s, String.length s) |
|||
;; |
|||
let () = |
|||
Callback.register "Query function cb" caml_query; |
|||
;;</lang> |
|||
<lang sh>ocamlopt -output-obj caml_part.ml -o caml_part_obj.o |
|||
gcc -c main.c -I"`ocamlc -where`" |
|||
gcc -o prog.opt main.o caml_part_obj.o \ |
|||
-L"`ocamlc -where`" \ |
|||
-lm -ldl -lasmrun</lang> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |