Files
mercury/tests/tabling/table_foreign_enum.m
2018-07-08 23:20:52 +02:00

73 lines
1.6 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
:- module table_foreign_enum.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module string.
:- pragma require_feature_set([memo]).
main(!IO) :-
test_foreign_enum(bar, baz, Result),
io.write_string("First result: " ++ Result ++ "\n", !IO),
print_second_result(!IO).
:- pragma no_inline(print_second_result/2).
:- pred print_second_result(io::di, io::uo) is det.
print_second_result(!IO) :-
test_foreign_enum(bar, baz, Result),
io.write_string("Second result: " ++ Result ++ "\n", !IO).
:- pragma memo(test_foreign_enum/3).
:- pred test_foreign_enum(foo::in, foo::in, string::out) is det.
test_foreign_enum(A, B, Out) :-
StrA = string.string(A),
Number = mystery(B),
Out = StrA ++ int_to_string(Number).
:- pragma no_inline(mystery/1).
:- func mystery(foo) = int.
:- pragma foreign_proc("C",
mystery(X::in) = (Y::out),
[will_not_call_mercury, promise_pure],
"
static int called = 0;
if (called) {
fprintf(stdout, ""mystery has been called again\\n"");
fflush(stdout);
}
Y = X + 1001;
called = 1;
").
:- type foo
---> foo
; bar
; baz.
:- pragma foreign_decl("C", "
#define CONSTANT1 300
#define CONSTANT2 400
#define CONSTANT3 500
").
:- pragma foreign_enum("C", foo/0,
[
foo - "CONSTANT1",
bar - "CONSTANT2",
baz - "CONSTANT3"
]).