Files
mercury/tests/valid/lambda_recompute.m
Zoltan Somogyi fdd141bf77 Clean up the tests in the other test directories.
tests/invalid/*.{m,err_exp}:
tests/misc_tests/*.m:
tests/mmc_make/*.m:
tests/par_conj/*.m:
tests/purity/*.m:
tests/stm/*.m:
tests/string_format/*.m:
tests/structure_reuse/*.m:
tests/submodules/*.m:
tests/tabling/*.m:
tests/term/*.m:
tests/trailing/*.m:
tests/typeclasses/*.m:
tests/valid/*.m:
tests/warnings/*.{m,exp}:
    Make these tests use four-space indentation, and ensure that
    each module is imported on its own line. (I intend to use the latter
    to figure out which subdirectories' tests can be executed in parallel.)

    These changes usually move code to different lines. For the tests
    that check compiler error messages, expect the new line numbers.

browser/cterm.m:
browser/tree234_cc.m:
    Import only one module per line.

tests/hard_coded/boyer.m:
    Fix something I missed.
2015-02-16 12:32:18 +11:00

115 lines
3.0 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% Regression test.
% Date: Feb 27: 1998.
% Symptom: Software error: variable XX not found.
% Cause: mode_util:recompute_instmap_delta was not recomputing the instmap
% delta of the inner lambda goal after some duplicate call elimination was
% performed.
:- module lambda_recompute.
:- interface.
:- import_module io.
:- pred compile_display_list(display_list, io__state, io__state).
:- mode compile_display_list(out, di, uo) is det.
%---------------------------------------------------------------------------%
:- implementation.
:- import_module bool.
:- import_module char.
:- import_module float.
:- import_module int.
:- import_module list.
:- import_module map.
:- import_module pair.
:- import_module require.
:- import_module std_util.
:- import_module string.
%---------------------------------------------------------------------------%
compile_display_list([mon(PPos, 1) | DList]) -->
{ PPos = 1 - 1 },
{ map__init(MapIKnow) },
{ for(0, 1, (pred(X::in, in, out) is det -->
for(0, 1, (pred(Y::in, in, out) is det -->
( { search(MapIKnow, pos(X, Y), Place) } ->
{ Place = place(Kind, _Flags, Obj) },
( (
{ Kind \= 1 }
;
{ PPos = pos(X, Y) }
)
->
element(place(pos(X, Y), Kind)),
( { Obj = [_N - T | _] } ->
element(thing(pos(X, Y), T))
;
[]
)
;
[]
)
;
[]
)
))
), [], DList) }.
:- pred element(element, display_list, display_list).
:- mode element(in, in, out) is det.
element(E, DL, [E | DL]).
:- type map == map(pos, place).
:- type pos == pair(int).
:- type place
---> place(int, int, list(pair(int))).
:- func pos(int, int) = pos.
:- pragma no_inline(pos/2).
pos(X, Y) = pos(X, Y).
:- type map_i_know
---> map(
list(map),
map,
list(map)
).
:- type element
---> place(pos, int)
; thing(pos, int)
; mon(pos, int).
:- type display_list == list(element).
%---------------------------------------------------------------------------%
:- pred get_monst(int, int, io__state, io__state).
:- mode get_monst(in, out, di, uo) is det.
:- external(get_monst/4).
:- pred for(int, int, pred(int, T, T), T, T).
:- mode for(in, in, pred(in, in, out) is det, in, out) is det.
:- mode for(in, in, pred(in, in, out) is semidet, in, out) is semidet.
:- mode for(in, in, pred(in, di, uo) is det, di, uo) is det.
for(Min, Max, Pred, Acc0, Acc) :-
( Min =< Max ->
call(Pred, Min, Acc0, Acc1),
for(Min+1, Max, Pred, Acc1, Acc)
;
Acc = Acc0
).