[m-users.] Problem with XML extra library
Volker Wysk
post at volker-wysk.de
Thu Jun 23 22:37:36 AEST 2022
Hi!
Am Donnerstag, dem 23.06.2022 um 20:34 +1000 schrieb Zoltan Somogyi:
> 2022-06-23 17:11 GMT+10:00 "Volker Wysk" <post at volker-wysk.de>:
> > main([File|Files]) -->
> > ...
> > { TextResult = ok(Text) },
> > pstate(mkEntity(Text), mkEncoding(utf8), init),
> > ...
> > -----
> >
> > The two "main" predicates are written in DCG syntax. The call to pstate/5 is
> > therefore (??) an abbreviation of
> >
> > pstate(mkEntity(Text), mkEncoding(utf8), init, !IO)
> >
> > But the declaration of pstate/5 in parsing.m is:
> >
> > :- pred pstate(entity, encoding, globals, io, pstate(unit)).
> > :- mode pstate(in, in, in, di, puo) is det.
> >
> > So the type of the output state variable is "pstate(unit)". But it is "io",
> > when main/3 is called. The types don't match.
> > ...
> > So why on earth does it work in tryit.m ?
>
> That program was written very early in Mercury's history. As you see,
> it was written using DCGs, since state variable notation did not exist yet.
> Later, some of its aspects were updated to use more modern Mercury style,
> but it was not a complete update.
>
> Many of the operations in xml.m have a pair of pstate() arguments as
> the last pair of arguments, which were intended to be used as the
> arguments threaded through their callers using DCG notation.
> These pstates contain both the I/O state, and the actual state
> of the parser, because encoding those two logically separate things
> as two separate argument pairs would collide with the fact that
> DCGs can thread only ONE argument pair through code.
>
> In many of the operations that take a pair of pstate arguments,
> the two pstate arguments actually have two different types,
> such as pstate(T1) and pstate(list(T2)). This works, because neither
> DCG notation nor (now) state variable notation require that the
> arguments in the argument pairs they thread through code
> have identical types. Yes, in practice, 99.9+% of the time they
> *do* have identical argument types, but they not *have to have*
> identical argument types.
>
> The reason why the code you are talking about works is because
>
> - the pstate/5 predicate called near the start of that clause has
> <io> and <pstate(unit)> as its two DCG arguments;
> - the finish/3 predicate called near the end of that clause has
> <pstate(T1)> and <io> as its two DCG arguments; and
> - the code in between uses !IO to refer to variables whose type is
> pstate(T) for some T.
>
> That last part is misleading for human readers,
Yes. :-) But I get it now.
> but the compiler
> neither knows this, nor does it care. This probably happened
> because the person converting the code from DCGs to state variable
> notation did not notice the switch in types from io states to pstates
> and then back to io states. (When the code still used DCGs,
> the code was less misleading, because the variables holding the pstates
> were nameless, instead of having misleading names.)
>
> I will look into fixing this readability/style issue.
I've downloaded the GIT Mercury version now. I need to reinstall Mercury, so
I can compile tryit and my test program.
Bye and thanks!
Volker
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <http://lists.mercurylang.org/archives/users/attachments/20220623/cd2cfd50/attachment.sig>
More information about the users
mailing list