mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-16 09:53:36 +00:00
Estimated hours taken: 18 Branches: main Move the univ, maybe, pair and unit types from std_util into their own modules. std_util still contains the general purpose higher-order programming constructs. library/std_util.m: Move univ, maybe, pair and unit (plus any other related types and procedures) into their own modules. library/maybe.m: New module. This contains the maybe and maybe_error types and the associated procedures. library/pair.m: New module. This contains the pair type and associated procedures. library/unit.m: New module. This contains the types unit/0 and unit/1. library/univ.m: New module. This contains the univ type and associated procedures. library/library.m: Add the new modules. library/private_builtin.m: Update the declaration of the type_ctor_info struct for univ. runtime/mercury.h: Update the declaration for the type_ctor_info struct for univ. runtime/mercury_mcpp.h: runtime/mercury_hlc_types.h: Update the definition of MR_Univ. runtime/mercury_init.h: Fix a comment: ML_type_name is now exported from type_desc.m. compiler/mlds_to_il.m: Update the the name of the module that defines univs (which are handled specially by the il code generator.) library/*.m: compiler/*.m: browser/*.m: mdbcomp/*.m: profiler/*.m: deep_profiler/*.m: Conform to the above changes. Import the new modules where they are needed; don't import std_util where it isn't needed. Fix formatting in lots of modules. Delete duplicate module imports. tests/*: Update the test suite to confrom to the above changes.
34 lines
820 B
Mathematica
34 lines
820 B
Mathematica
% This is a regression test. Earlier versions of the compiler did not notice
|
|
% that Acc0 is an input parameter of the lambda expression and thus did not
|
|
% detect that the disjunction is a switch on Acc0.
|
|
|
|
:- module lambda_switch.
|
|
|
|
:- interface.
|
|
|
|
:- import_module maybe.
|
|
|
|
:- type agg_func(T, S) ---> agg(S, func(S, T) = S).
|
|
:- inst agg_mode == bound(agg(ground, func(in, in) = out is det)).
|
|
:- mode agg_in == agg_mode >> agg_mode.
|
|
:- mode agg_out == free >> agg_mode.
|
|
|
|
:- func min(func(T) = int) = agg_func(T, maybe(int)).
|
|
:- mode min(func(in) = out is det) = agg_out is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module int.
|
|
|
|
min(F) = agg(no, M) :-
|
|
M = (func(Acc0, Val0) = Acc :-
|
|
Val = apply(F, Val0),
|
|
(
|
|
Acc0 = no,
|
|
Acc = yes(Val)
|
|
;
|
|
Acc0 = yes(Acc1),
|
|
( Acc1 < Val -> Acc = yes(Acc1) ; Acc = yes(Val))
|
|
)
|
|
).
|