Estimated hours taken: 15
Branches: main
Support currying of multi-moded predicates or functions when the mode to curry
can be determined from the insts of the higher-order arguments. e.g.
mymap(P, L0, L) :-
map(wrap(P), L0, L).
:- pred wrap(...).
:- mode wrap(in(pred(...) is det), ...) is det.
:- mode wrap(in(pred(...) is cc_multi, ...) is cc_multi.
...
compiler/post_typecheck.m:
Don't abort immediately on taking the address of a multi-moded
predicate. Leave the proc_id as invalid_proc_id and handle that
in polymorphism.m.
compiler/polymorphism.m:
Convert higher order terms to lambda goals even if the proc_id is
invalid (as above) moded by arbitrarily using the first mode. Then
polymorphism can proceed as usual. Mark the goals with feature
`feature_lambda_undetermined_mode', which tells mode checking to
handle it.
Add a predicate to fix up such lambda goals once mode checking does
figure out which mode should be called.
compiler/modecheck_unify.m:
compiler/mode_errors.m:
Handle goals with the `feature_lambda_undetermined_mode'. Try to
select a unique mode for the curried predicate then fix up the lambda
goal.
compiler/hlds_goal.m:
compiler/saved_vars.m:
Add `feature_lambda_undetermined_mode'.
compiler/goal_util.m:
Add a predicate to return all the pred_ids called in a goal
with the associated argument variables.
NEWS:
doc/reference_manual.texi:
Document and announce the change.
tests/hard_coded/Mmakefile:
tests/hard_coded/multimode_addr.exp:
tests/hard_coded/multimode_addr.m:
tests/invalid/Mmakefile:
tests/invalid/multimode_addr_problems.err_exp:
tests/invalid/multimode_addr_problems.m:
Add tests.