%% $Id: ary3.mercury,v 1.1 2001/05/31 02:27:48 doug Exp $ %% http://www.bagley.org/~doug/shootout/ %% based on some code from Ralph Becket :- module mytest. :- interface. :- import_module io. :- pred main(io__state, io__state). :- mode main(di, uo) is det. :- implementation. :- import_module array, int, list, string, require. main --> io__command_line_arguments(ArgV), ( { ArgV = [], N = 1 } ; { ArgV = [Arg], N = string__det_to_int(Arg) } ; { ArgV = [_,_|_], error("usage: arrayaccess [N]") } ), { X = some_naturals(0, array__init(N, 0)) }, { Y = add_arrays_n(1000, N-1, X, array__init(N, 0)) }, io__write_int(array__lookup(Y, 0)), io__write_string(" "), io__write_int(array__lookup(Y, N - 1)), io__nl. :- func some_naturals(int, array(int)) = array(int). :- mode some_naturals(in, array_di) = array_uo is det. some_naturals(I, A) = ( if I =< array__max(A) then some_naturals(I + 1, array__set(A, I, I + 1)) else A ). :- func add_array(int, array(int), array(int)) = array(int). :- mode add_array(in, array_ui, array_di) = array_uo is det. add_array(I, A, B) = ( if I < 0 then B else add_array(I - 1, A, array__set(B, I, array__lookup(A, I) + array__lookup(B, I))) ). :- func add_arrays_n(int, int, array(int), array(int)) = array(int). :- mode add_arrays_n(in, in, array_ui, array_di) = array_uo is det. add_arrays_n(N, Len, A, B) = ( if N > 0 then add_arrays_n(N - 1, Len, A, add_array(Len, A, B)) else B ).