mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 17:33:38 +00:00
73 lines
1.6 KiB
Mathematica
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"
|
|
]).
|