[m-dev.] for review: new typeclass method syntax
David Glen JEFFERY
dgj at cs.mu.oz.au
Wed Jan 7 17:00:59 AEDT 1998
> > --- make_hlds.m 1997/12/22 09:55:55 1.248
> > +++ make_hlds.m 1998/01/05 03:37:08
> ...
> > + io__stderr_stream(StdErr),
> > + io__set_output_stream(StdErr, OldStream),
> > + prog_out__write_context(Context),
> > + io__write_string("Error: typeclass `"),
> > + prog_out__write_sym_name(Name),
> > + io__write_char('/'),
> > + io__write_int(ClassArity),
> > + io__write_string("' multiply defined.\n"),
> > + io__set_exit_status(1),
> > + io__set_output_stream(OldStream, _),
>
> (1) You ought to print out the location of the previous definition.
> (2) Any reason why you don't print this message out using the
> predicate multiple_def_error/5 which is defined in make_hlds.m?
Let me screw my head on correctly. This piece of code isn't for a multiply
defined typeclass, it is for an instance declaration for an undefined
typeclass.
s/multiply defined/not defined
Here's the new diff:
Estimated hours taken: 1/2
A few minor changes, including fixing the syntax of a typeclass declaration.
The methods inside a typeclass declaration no longer have a ":-" at the start.
compiler/make_hlds.m:
Give an error message if an instance declaration is given for a
typeclass that does not exist.
compiler/prog_io.m:
Export parse_decl, and make the output a maybe_item_and_context so
that it is more useful to prog_io_typeclass.
compiler/prog_io_typeclass.m:
Use parse_decl rather than parse_item to parse the class methods. This
way the ":-" is left off.
compiler/notes/compiler_design.html:
Document why check_typeclass is the final semantic analysis pass.
Index: compiler/make_hlds.m
===================================================================
RCS file: /home/staff/zs/imp/mercury/compiler/make_hlds.m,v
retrieving revision 1.248
diff -u -r1.248 make_hlds.m
--- make_hlds.m 1997/12/22 09:55:55 1.248
+++ make_hlds.m 1998/01/07 05:53:49
@@ -1261,7 +1261,7 @@
di, uo) is det.
module_add_instance_defn(Module0, Constraints, Name, Types, Interface, VarSet,
- Status, _Context, Module) -->
+ Status, Context, Module) -->
{ module_info_classes(Module0, Classes) },
{ module_info_instances(Module0, Instances0) },
{ list__length(Types, ClassArity) },
@@ -1277,8 +1277,16 @@
Instances) },
{ module_info_set_instances(Module0, Instances, Module) }
;
- % XXX give an error since the class has not been
- % XXX defined
+ io__stderr_stream(StdErr),
+ io__set_output_stream(StdErr, OldStream),
+ prog_out__write_context(Context),
+ io__write_string("Error: typeclass `"),
+ prog_out__write_sym_name(Name),
+ io__write_char('/'),
+ io__write_int(ClassArity),
+ io__write_string("' not defined.\n"),
+ io__set_exit_status(1),
+ io__set_output_stream(OldStream, _),
{ Module = Module0 }
).
Index: compiler/prog_io.m
===================================================================
RCS file: /home/staff/zs/imp/mercury/compiler/prog_io.m,v
retrieving revision 1.167
diff -u -r1.167 prog_io.m
--- prog_io.m 1997/12/19 03:07:55 1.167
+++ prog_io.m 1998/01/07 04:05:03
@@ -102,6 +102,15 @@
:- pred parse_item(string, varset, term, maybe_item_and_context).
:- mode parse_item(in, in, in, out) is det.
+ % parse_decl(ModuleName, VarSet, Term, Result)
+ %
+ % parse Term as a declaration. If successful, Result is bound to the
+ % parsed item, otherwise it is bound to an appropriate error message.
+ % Qualify appropriate parts of the item, with ModuleName as the module
+ % name.
+:- pred parse_decl(string, varset, term, maybe_item_and_context).
+:- mode parse_decl(in, in, in, out) is det.
+
%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%
@@ -427,11 +436,10 @@
parse_item(ModuleName, VarSet, Term, Result) :-
( %%% some [Decl, DeclContext]
- Term = term__functor(term__atom(":-"), [Decl], DeclContext)
+ Term = term__functor(term__atom(":-"), [Decl], _DeclContext)
->
% It's a declaration
- parse_decl(ModuleName, VarSet, Decl, R),
- add_context(R, DeclContext, Result)
+ parse_decl(ModuleName, VarSet, Decl, Result)
; %%% some [DCG_H, DCG_B, DCG_Context]
% It's a DCG clause
Term = term__functor(term__atom("-->"), [DCG_H, DCG_B],
@@ -494,18 +502,14 @@
%-----------------------------------------------------------------------------%
- % parse a declaration
-
-:- pred parse_decl(string, varset, term, maybe1(item)).
-:- mode parse_decl(in, in, in, out) is det.
parse_decl(ModuleName, VarSet, F, Result) :-
(
- F = term__functor(term__atom(Atom), As, _Context)
+ F = term__functor(term__atom(Atom), As, Context)
->
(
process_decl(ModuleName, VarSet, Atom, As, R)
->
- Result = R
+ add_context(R, Context, Result)
;
Result = error("unrecognized declaration", F)
)
Index: compiler/prog_io_typeclass.m
===================================================================
RCS file: /home/staff/zs/imp/mercury/compiler/prog_io_typeclass.m,v
retrieving revision 1.1
diff -u -r1.1 prog_io_typeclass.m
--- prog_io_typeclass.m 1997/12/19 03:07:59 1.1
+++ prog_io_typeclass.m 1998/01/07 04:02:05
@@ -151,7 +151,7 @@
list__map(lambda([MethodTerm::in, Method::out] is det,
(
% Turn the term into an item
- parse_item(ModuleName, VarSet, MethodTerm, Item),
+ parse_decl(ModuleName, VarSet, MethodTerm, Item),
% Turn the item into a class_method
item_to_class_method(Item, MethodTerm, Method)
)),
Index: compiler/notes/compiler_design.html
===================================================================
RCS file: /home/staff/zs/imp/mercury/compiler/notes/compiler_design.html,v
retrieving revision 1.13
diff -u -r1.13 compiler_design.html
--- compiler_design.html 1998/01/02 00:11:10 1.13
+++ compiler_design.html 1998/01/05 03:37:34
@@ -313,12 +313,13 @@
check_typeclass.m checks that, each instance declaration, that the
types, modes and determinism of each predicate/function that is a
method of the class is correct (ie. that it matches the typeclass
- declaration). In this pass, pred_ids and proc_ids are assigned to
- the methods for each instance. In addition, while checking that the
- superclasses of a class are satisfied by the instance declaration, a
- set of constraint_proofs are built up for the superclass constraints.
- These are used by polymorphism.m when generating the
- base_typeclass_info for the instance.
+ declaration). This pass is performed at the end of semantic analysis
+ because it needs mode and determinism information. In this pass,
+ pred_ids and proc_ids are assigned to the methods for each instance. In
+ addition, while checking that the superclasses of a class are satisfied
+ by the instance declaration, a set of constraint_proofs are built up
+ for the superclass constraints. These are used by polymorphism.m when
+ generating the base_typeclass_info for the instance.
<dt> simplification (simplify.m)
love and cuddles,
dgj
--
David Jeffery (dgj at cs.mu.oz.au) | Marge: Did you just call everyone "chicken"?
MEngSc student, | Homer: Noooo. I swear on this Bible!
Department of Computer Science | Marge: That's not a Bible; that's a book of
University of Melbourne | carpet samples!
Australia | Homer: Ooooh... Fuzzy.
More information about the developers
mailing list