Fergus' hack (was Re: [mercury-users] polymorphism)
Bart Demoen
bmd at cs.kuleuven.ac.be
Wed Oct 1 17:34:50 AEST 1997
Lee wrote
> It allows you to have more code reuse
I didn't understand this at first, especially not when one writes the
predicate like
p(forward,...) :- ...
p(backward,...) :- ...
I see no code reuse: it is the same code reuse as if you have defined
a predicate for each mode.
But there is code reuse if you write it in the form
p(H,...) :-
(H = forward ->
.....
; .....).
because now you can add common code, like in
p(H,...) :-
something_in_common1,
(H = forward ->
.....
; .....),
something_in_common2.
I wanted to explore thus but instead I went through a series of
programs (of which I give two) whose compilation unexpectedly (for me)
failed, all with the declarations:
:- type ab ---> (a ; b).
:- inst a = bound(a).
:- inst b = bound(b).
:- pred f(ab,int,int).
:- mode f(in(a),in,out).
:- mode f(in(b),out,in).
prog1
=====
f(Z,X,Y) :-
T = 9,
(Z = a ->
Y is T + 1
; X is T + 7
).
prog2
=====
f(Z,X,Y) :-
(Z = a ->
Y is 1
; X is 7
).
---------------
the message was in every case something like
fergushack.m:032: In clause for `f(in(fergushack:a), in, out)':
fergushack.m:032: mode mismatch in if-then-else.
fergushack.m:032: `Y' :: unique(1), free.
???
Bart
More information about the users
mailing list