[m-users.] parsing, seeking advice on simple combinator project and also operators.
Sean Charles (emacstheviking)
objitsu at gmail.com
Sun Oct 30 19:02:28 AEDT 2022
Hi Ju8lien,
Yes, I was already aware of that,. part of my question was, "What modules define those operators?" as it would make it easier to try to re-use one.
If I had included 'int', and still wanted to use, '<' for my own purposes, I am assuming that I could use
:- use_module int.
and then qualify the real '<' somehow, not sure what the synta would be
X int.'<' Y perhaps?
Anyway, I am just going to keep reading, keep trying small test examples until it sinks into my thick skull.
Thanks all,
Sean.
> On 30 Oct 2022, at 02:33, Julien Fischer <jfischer at opturion.com> wrote:
>
>
>
> On Sat, 29 Oct 2022, Sean Charles (emacstheviking) wrote:
>
>> I have spent a goodly few days on and off reading the xml.parser.m file in the extras folder for some insights but whoever wrote that is light years ahead of
>> me, it's been hard to follow at best.
>> I also returned to reading the code for mmc-doc, another good source of inspiration, in particular I tried to adapt this code but I don't think I filly
>> understand yet how Mercury does higher-order functions, nor do I fully understand modes/insts when related to HOP.
>> Here is the code, it provides (file: config.m) a function '//' that allows chaining, which is what I am trying to do:
>> :- type maybeio == (pred(maybe(string), io, io)).
>> :- inst maybeio == (pred(out, di, uo) is det).
>> :- func (maybeio::in(maybeio)) // (maybeio::in(maybeio))
>> = (maybeio::out(maybeio)).
>> A // B = C :-
>> C = (pred(Res::out, !.IO::di, !:IO::uo) is det :-
>> A(Res1, !IO),
>> (
>> Res1 = Res @ yes(_)
>> ;
>> Res1 = no,
>> B(Res, !IO)
>> )).
>> I can see that the chain is started further down:
>> GetConfig = get_environment_var("XDG_CONFIG_HOME")
>> // get_environment_var("APPDATA")
>> :
>> :
>> I see that the definition of '//' is such that it expects predicates on both sides and that they are executed -inside- the implementation of the function i.e.
>> the get_environment_var() is not called at that point in the code but is in fact passed in as an argument to '//', and then executed by the line 'A(Res1, !IO)'
>> or 'B(Res,!IO)', that much I have understood. Hope resigns supreme.
>> How did the author know to use '//'? Given that Mercury doesn't allow arbitrary strings of non-alpha characters to be used as a function/operator name like
>> Prolog. On page 6, section 2 'Operators' (reference manual), there is a huge list of operators but it isn't obvious where to look for the module that defines
>> them, I am assuming that '//' is used in a module NOT imported into the source file but is recognised by the parser? How does one know what operators can be
>> used for ones own purposes, I managed to find that '//' and '**' worked for me but I am not sure what they do, I am guessing that '**' is 'power' or
>> 'exponential' ?
>
> That section of the reference manual was re-written recently. If you
> have a look at the ROTD version, you'll find the explanation:
>
> Note that operators are a syntactic concept. The ‘+’ infix operator, for
> example, is only a symbol; it does not mean addition unless you write or
> import code that defines it as addition. Modules in the Mercury standard
> library, such as int and float, provide such arithmetic definitions. To
> illustrate further, the ‘-’ infix operator is defined as subtraction by
> those modules but is defined as a pair constructor by the pair module.
>
> Julien.
More information about the users
mailing list