Files
mercury/samples/java_interface/standalone_java/mercury_lib.m
Paul Bone 8b48c420d7 [java] Make changes following Julien's review of my recent patch
java/runtime/JavaInternal.java:
java/runtime/MercuryRuntime.java:
java/runtime/MercuryThreadPool.java:
samples/java_interface/standalone_java/JavaMain.java:
samples/java_interface/standalone_java/Makefile:
samples/java_interface/standalone_java/mercury_lib.m:
    As above.
2014-12-16 12:45:37 +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 :-
( N < 2 ->
F = 1
; N > fibs_thresh ->
F2 = future((func) = fibs_par(N-2)),
F1 = fibs_par(N-1),
F = F1 + wait(F2)
;
F = fibs_seq(N-1) + fibs_seq(N-2)
).
:- func fibs_seq(int) = int.
fibs_seq(N) =
( N < 2 ->
1
;
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.
%-----------------------------------------------------------------------------%