[m-dev.] for review: prelim support for hash consing
Peter Ross
petdr at cs.mu.OZ.AU
Wed Aug 25 17:08:09 AEST 1999
On 25-Aug-1999, David Jeffery <dgj at cs.mu.OZ.AU> wrote:
> On 20-Aug-1999, Peter Ross <petdr at cs.mu.OZ.AU> wrote:
> >
> > Estimated hours taken: 15
> >
> > Add preliminary support for memoing type constructors (hash consing)
>
> You should mention what this support is: you generate a pred to do the
> construction unification for each hash_consed constructor. I guess that
> the intention is to using tabling to get hash_consing for free. Is that
> right? That is what I gather from the diff... and if so it needs to be
> explained somewhere.
>
This is just what zs asked me to implement, seeing I knew this bit of
the compiler better then him and had some spare time.
> > compiler/make_hlds.m:
> > The core of the change.
> > For every
> > :- pragma memo_cons(Constructor/Arity).
> > Construct a function
> > hash_cons_C(X1, ..., XN) = C(X1, ..., XN).
> > where hash_cons_C is a suitably name mangled function.
>
> Perhaps hash_cons should be the name of this pragma? Anyhow, you should
> probably add a sentence saying that this hash_cons_C pred is intended to
> replace all construction unifications.
>
I prefer memo_cons since you are memoing the constructor.
> > compiler/hlds_pred.m:
> > Add a new marker which indicates that the predicate is an
> > automatically generated predicate which is meant to do a hash consed
> > construction unification.
> >
> > compiler/hlds_out.m:
> > compiler/intermod.m:
> > Support the memo_cons marker.
> >
> > compiler/mercury_to_mercury.m:
> > Handle the pragma memo_cons.
> >
> > compiler/module_qual.m:
> > compiler/modules.m:
> > Handle the new type tabled_cons.
> >
> > compiler/prog_data.m:
> > Add type tabled_cons which stores the information declared in the
> > pragma.
> >
> > compiler/prog_io_pragma.m:
> > Parse the memo_cons pragma.
> >
> > compiler/prog_out.m:
> > Add a new predicate sym_name_to_term, which given a symname
> > constructs a valid prog_term for that name.
> >
> > Index: intermod.m
> > ===================================================================
> > RCS file: /home/staff/zs/imp/mercury/compiler/intermod.m,v
> > retrieving revision 1.66
> > diff -u -r1.66 intermod.m
> > --- intermod.m 1999/07/13 08:53:01 1.66
> > +++ intermod.m 1999/08/19 12:53:43
> > @@ -1188,6 +1188,8 @@
> > intermod__should_output_marker(generate_inline, _) :-
> > % This marker should only occur after the magic sets transformation.
> > error("intermod__should_output_marker: generate_inline").
> > + % XXX is this correct?
> > +intermod__should_output_marker(memo_cons, yes).
>
> I have no idea. Simon?
>
>
>
>
> > + { module_info_incr_errors(Module0, Module) },
> > + prog_out__write_context(Context),
> > + io__write_string(
> > + "Error: export status mismatch.\n"),
>
> This error message stinks.
>
Any suggestions what to change it to?
I couldn't think of a better message.
> > + { Info = Info0 }
> > + )
> > + ;
> > + { module_info_incr_errors(Module0, Module) },
> > + prog_out__write_context(Context),
> > + io__write_string("Error: constructor '"),
> > + hlds_out__write_cons_id(cons(Constructor, Arity)),
> > + io__write_string("' in multiple types.\n"),
> > + { Info = Info0 }
> > +
> > + % XXX should list what those types are if -E
>
> This error message really isn't very helpful either... it just tells you that
> the type is visible in multiple types. It doesn't mention why that is a problem
> (ie. because of the memo_cons pragma). I guess it mentions the line number of
> the pragma, but I still think you could say something like:
> Error: pragma memo_cons declaration for constructor `foo/2' which
> appears in multiple types.
>
OK.
> > + % XXX Need to handle existential construction
> > + % unifications correctly.
> > + { ExistQVars = [] },
> > + { ClassContext = constraints([], []) },
>
> You definately need to address this XXX. I'll talk to you about this
> personally.
>
OK.
> > + % XXX this actually be in the module that handles hashconsing
>
> s/this actually/this should actually/
>
> > + % when it is made.
> > +:- pred make_hashcons_func_name(sym_name::in, arity::in, type_id::in,
> > + string::out) is det.
> > +
> > +make_hashcons_func_name(ConsName, ConsArity, TypeName - TypeArity, Name) :-
> > + prog_out__sym_name_to_string(ConsName, ConsStr),
> > + prog_out__sym_name_to_string(TypeName, TypeStr),
> > + string__format("cons_%s/%d_%s/%d", [s(TypeStr), i(TypeArity),
> > + s(ConsStr), i(ConsArity)], Name).
>
> The mangled name could maybe be a little more robust... I'm not sure what,
> though.
>
That issue can be resolved by zs when he starts to use this code.
> > +:- pred construct_types_and_modes(sym_name::in, arity::in,
> > + type_id::in, hlds_type_defn::in, module_info::in,
> > + type_and_mode::out, list(type_and_mode)::out) is det.
>
> Could you please add a comment to this saying what it does. (I worked it
> out after a while, but it deserves a comment).
>
> > +
> > +construct_types_and_modes(ConsName, Arity, TypeId, TypeDefn,
> > + ModuleInfo, TypeAndMode, TypesAndModes) :-
> > + hlds_data__get_type_defn_tparams(TypeDefn, TypeParams),
> > + construct_type(TypeId, TypeParams, Type),
> > +
> > + type_util__get_cons_id_arg_types(ModuleInfo, Type,
> > + cons(ConsName, Arity), TypeArgs),
> > +
> > + P = (pred(T0::in, T::out) is det :- T = type_only(T0)),
> > + P(Type, TypeAndMode),
> > + list__map(P, TypeArgs, TypesAndModes).
>
> Why don't you add it with the correct modes? You know it is (in, in, ..., out).
>
That is what modes functions default to anyway.
> > Index: prog_io_pragma.m
> > ===================================================================
> > RCS file: /home/staff/zs/imp/mercury/compiler/prog_io_pragma.m,v
> > retrieving revision 1.21
> > diff -u -r1.21 prog_io_pragma.m
> > --- prog_io_pragma.m 1999/07/13 08:53:24 1.21
> > +++ prog_io_pragma.m 1999/08/19 08:40:49
> > @@ -320,6 +320,13 @@
> > parse_tabling_pragma(ModuleName, "minimal_model", eval_minimal,
> > PragmaTerms, ErrorTerm, Result).
> >
> > +parse_pragma_type(ModuleName, "memo_cons", PragmaTerms, ErrorTerm,
> > + _VarSet, Result) :-
> > + parse_simple_pragma(ModuleName, "memo_cons",
> > + lambda([Name::in, Arity::in, Pragma::out] is det,
> > + Pragma = tabled_cons(Name, Arity)),
> > + PragmaTerms, ErrorTerm, Result).
>
> Just to be picky... you should probably use the new HO syntax here.
> (ie. `pred' rather than `lambda').
>
cut and paste problem, fixed.
> > Index: prog_out.m
> > ===================================================================
> > RCS file: /home/staff/zs/imp/mercury/compiler/prog_out.m,v
> > retrieving revision 1.43
> > diff -u -r1.43 prog_out.m
> > --- prog_out.m 1999/07/13 08:53:25 1.43
> > +++ prog_out.m 1999/08/19 08:28:12
> > @@ -68,6 +68,12 @@
> > :- pred prog_out__sym_name_to_string(sym_name, string, string).
> > :- mode prog_out__sym_name_to_string(in, in, out) is det.
> >
> > + % sym_name_to_term(SymName, Args, Term):
> > + % convert a symbol name with an associated list of terms
> > + % into a term.
> > +:- pred prog_out__sym_name_to_term(sym_name, list(prog_term), prog_term).
> > +:- mode prog_out__sym_name_to_term(in, in, out) is det.
>
> Isn't there already something like this somewhere else?
>
Not that I could find.
Pete.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions: mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------
More information about the developers
mailing list