mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-25 14:24:11 +00:00
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.
12 lines
766 B
Plaintext
12 lines
766 B
Plaintext
multimode_addr_problems.m:023: In clause for `main(di, uo)':
|
|
multimode_addr_problems.m:023: In unification of `Abs' and higher-order term.
|
|
multimode_addr_problems.m:023: Could not determine the mode of predicate
|
|
multimode_addr_problems.m:023: `multimode_addr_problems.absolute'/2 by the
|
|
multimode_addr_problems.m:023: insts of the higher-order arguments only.
|
|
multimode_addr_problems.m:048: In clause for `my_foldl(in((func(in, in) = out
|
|
multimode_addr_problems.m:048: is det)), in, in) = out':
|
|
multimode_addr_problems.m:048: mode error in unification of `P' and
|
|
multimode_addr_problems.m:048: higher-order term based on multi-moded
|
|
multimode_addr_problems.m:048: predicate `multimode_addr_problems.f2p'/4.
|
|
For more information, recompile with `-E'.
|