mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-19 19:33:46 +00:00
65 lines
1.7 KiB
Mathematica
65 lines
1.7 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
%
|
|
% This is a regression test -- previous versions of the Mercury compiler
|
|
% (Oct 98) got a `var not found' error for this test case, due to
|
|
% mode analysis producing incorrect instmap delta annotations
|
|
% for the complicated unification in the implied mode in the
|
|
% first call to map.from_assoc_list in next/3.
|
|
%
|
|
|
|
:- module var_not_found.
|
|
|
|
:- interface.
|
|
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module array.
|
|
:- import_module bool.
|
|
:- 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.
|
|
|
|
main(!IO) :-
|
|
map.from_assoc_list([int(1) - int(2)], Map),
|
|
( if next(Map, Map, Next) then
|
|
io.write_line(Next, !IO)
|
|
else
|
|
io.write_string("failed (as we should)\n", !IO)
|
|
).
|
|
|
|
:- type data
|
|
---> int(int)
|
|
; flt(float)
|
|
; str(string)
|
|
; array(map(data, data))
|
|
; void.
|
|
|
|
:- pred next(map(data, data)::in, map(data, data)::in, map(data, data)::out)
|
|
is semidet.
|
|
|
|
next(Thing, Array, Next) :-
|
|
map.to_assoc_list(Thing, [int(0) - Key, int(1) - _]),
|
|
map.to_assoc_list(Array, List),
|
|
next_pair(List, Key, NewKey - NewValue),
|
|
map.from_assoc_list([int(0) - NewKey, int(1) - NewValue], Next).
|
|
|
|
:- pred next_pair(list(pair(data))::in, data::in, pair(data)::out) is semidet.
|
|
|
|
next_pair([Pair0 | Pairs], Key, Pair) :-
|
|
( if Pair0 = Key - _ then
|
|
Pairs = [Pair | _]
|
|
else
|
|
next_pair(Pairs, Key, Pair)
|
|
).
|