mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-16 01:43:35 +00:00
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.
113 lines
2.7 KiB
Mathematica
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.
|
|
%-----------------------------------------------------------------------------%
|