Files
mercury/samples/java_interface/standalone_java/mercury_lib.m
Julien Fischer 1702444cb1 Style and formatting fixes for Java interface samples.
samples/java_interface/java_calls_mercury/mercury_main.m:
samples/java_interface/mercury_calls_java/java_main_int.m:
samples/java_interface/standalone_java/JavaMain.java:
samples/java_interface/standalone_java/Makefile:
samples/java_interface/standalone_java/mercury_lib.m:
    As above.
2022-01-15 17:04:46 +11:00

113 lines
2.7 KiB
Mathematica

%-----------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%-----------------------------------------------------------------------------%
:- module mercury_lib.
:- interface.
:- import_module io.
%-----------------------------------------------------------------------------%
% Write "Hello World" to the current Mercury text output stream.
%
:- pred write_hello(io::di, io::uo) is det.
% cube(X) returns X * X * X.
%
:- func cube(int) = int.
% fibs(N) returns the Nth Fibonacci number using a parallelised naive
% algorithm.
%
:- func fibs(int) = int.
%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%
:- implementation.
:- import_module int.
:- import_module list.
:- import_module string.
:- import_module thread.
:- import_module thread.future.
%-----------------------------------------------------------------------------%
:- pragma foreign_export("Java", write_hello(di, uo), "writeHello").
write_hello(!IO) :-
io.print_line("Hello World", !IO).
%-----------------------------------------------------------------------------%
:- pragma foreign_export("Java", cube(in) = out, "cube").
cube(X) = X * X * X.
%-----------------------------------------------------------------------------%
%
% Trivial concurrency test.
%
% No one would normally write fibs this way.
:- pragma foreign_export("Java", fibs(in) = out, "fibs").
fibs(N) = fibs_par(N).
:- func fibs_par(int) = int.
fibs_par(N) = F :-
( if N < 2 then
F = 1
else if N > fibs_thresh then
F2 = future((func) = fibs_par(N - 2)),
F1 = fibs_par(N - 1),
F = F1 + wait(F2)
else
F = fibs_seq(N - 1) + fibs_seq(N - 2)
).
:- func fibs_seq(int) = int.
fibs_seq(N) =
( if N < 2 then
1
else
fibs_seq(N-2) + fibs_seq(N-1)
).
:- func fibs_thresh = int.
fibs_thresh = 20.
%-----------------------------------------------------------------------------%
%
% Initialiser for this library.
%
:- initialise initialiser/2.
:- pred initialiser(io::di, io::uo) is det.
initialiser(!IO) :-
io.print_line("mercury_lib: the initialiser has now been invoked.", !IO).
%-----------------------------------------------------------------------------%
%
% Finaliser for this library.
%
:- finalise finaliser/2.
:- pred finaliser(io::di, io::uo) is det.
finaliser(!IO) :-
io.print_line("mercury_lib: the finaliser has now been invoked.", !IO).
%-----------------------------------------------------------------------------%
:- end_module mercury_lib.
%-----------------------------------------------------------------------------%