<div dir="auto">Sean, <div dir="auto">Your testimony is an interesting one.</div><div dir="auto"><br></div><div dir="auto">Yes, Mercury does have a steep learning curve, but after a while your code will build like a charm and you'll get hooked. It is very rewarding, especially if you have had some prior experience with prolog. (Which helps a bit yet may be misleading at times).</div><div dir="auto"><br></div><div dir="auto">My advice: read Julien's code (mercury_json, mercury_cairo, and more). I'm a big fan of his. It is very clearly commented and nicely laid out.  You will learn a lot from it, provided that you keep the docs open at hand. </div><div dir="auto"><br></div><div dir="auto">And don't be discouraged by compiler whinings, like 'instantiatedness not being the same in all branches of if-then-elses', or 'arguments being clobbered while still alive' (OMG, this one nearly drove me mad a few times). You'll come to manage these and a few other exotic delicacies over time, with some musings and a wee bit of sweat.</div><div dir="auto">Best</div><div dir="auto">Fabrice</div><div dir="auto"><br></div><div dir="auto"><br><div dir="auto"><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le sam. 24 avr. 2021 à 10:35 PM,  <<a href="mailto:users-request@lists.mercurylang.org">users-request@lists.mercurylang.org</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Send users mailing list submissions to<br>
        <a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
        <a href="https://lists.mercurylang.org/listinfo/users" rel="noreferrer noreferrer" target="_blank">https://lists.mercurylang.org/listinfo/users</a><br>
or, via email, send a message with subject or body 'help' to<br>
        <a href="mailto:users-request@lists.mercurylang.org" target="_blank" rel="noreferrer">users-request@lists.mercurylang.org</a><br>
<br>
You can reach the person managing the list at<br>
        <a href="mailto:users-owner@lists.mercurylang.org" target="_blank" rel="noreferrer">users-owner@lists.mercurylang.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than "Re: Contents of users digest..."<br>
<br>
<br>
Today's Topics:<br>
<br>
   1. DCG-s in Mercury (Sean Charles (emacstheviking))<br>
   2. Re: DCG-s in Mercury (Tomas By)<br>
   3. Re: DCG-s in Mercury (Julien Fischer)<br>
   4. Re: DCG-s in Mercury (Sean Charles (emacstheviking))<br>
   5. getopt_io return value type on success?<br>
      (Sean Charles (emacstheviking))<br>
   6. Re: getopt_io return value type on success? (Zoltan Somogyi)<br>
   7. Re: getopt_io return value type on success?<br>
      (Sean Charles (emacstheviking))<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Sat, 24 Apr 2021 10:33:31 +0100<br>
From: "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>><br>
To: users <<a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a>><br>
Subject: [m-users.] DCG-s in Mercury<br>
Message-ID: <<a href="mailto:6D19C8E1-8CD9-47D5-87E8-C7CE587E06A0@gmail.com" target="_blank" rel="noreferrer">6D19C8E1-8CD9-47D5-87E8-C7CE587E06A0@gmail.com</a>><br>
Content-Type: text/plain;       charset=utf-8<br>
<br>
Hi,<br>
<br>
I am but a mere mortal, not formally schooled in logic and its terminology. Despite repeated googling, watching and reading my entire set of Prolog books, the terms ‘existential’ and ‘universal’ barely mean anything to me and now I have two sets of DCG rules to port from SWI Prolog and I just don’t know where to start. At the root ?<br>
<br>
Is there anywhere to be found a short, concise example of how to create a DCG rule, just so I can see some examples of the mode declarations, mine are not going to be used as generators, just as a lever and a parser/AST builder. I use phrase_from_file/3 in SWI Prolog, and the debugger means I can step through any rules that aren’t doing what I think. So far in mercury I have not even worked out how to start calling the head rule, if you call it that.<br>
<br>
I’ve built and use an ROTD from sources:<br>
<br>
    ➜  mcnew mmc —version<br>
    Mercury Compiler, version rotd-2021-04-15, on x86_64-apple-darwin19.6.0<br>
    Copyright (C) 1993-2012 The University of Melbourne<br>
    Copyright (C) 2013-2021 The Mercury team<br>
<br>
<br>
I continue reading the Mercury language reference guide in hope of more Eureka moments, I really think Mercury is the one language I could spend the rest of my days being happy with, it has the good bits from Prolog and Haskell and much more but as a non-degree/CS person, as a completely self-taught developer going back 35 years, the documentation is somewhat lacking in sympathy for newcomers, not its fault to be sure but Mercury is not mainstream and so there is not an awful lot of example stuff out there and what I have found suffers from the same problem: I am not smart enough to understand the awesomely flowery language as it leaves me feeling cold and glazed over and totally disillusioned at times. Again, as they say, “It’s not you, it’s me”.<br>
<br>
So. Thanks for Mercury chaps, a brilliant piece of work that the world probably won’t ever fully appreciate, but I do.<br>
It’s just a shame I can’t use it yet! <br>
:)<br>
<br>
All the best,<br>
Sean.<br>
<br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Sat, 24 Apr 2021 11:56:01 +0200<br>
From: Tomas By <<a href="mailto:tomas@basun.net" target="_blank" rel="noreferrer">tomas@basun.net</a>><br>
To: "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>><br>
Cc: users <<a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a>><br>
Subject: Re: [m-users.] DCG-s in Mercury<br>
Message-ID: <<a href="mailto:8735vg80r2.wl-tomas@basun.net" target="_blank" rel="noreferrer">8735vg80r2.wl-tomas@basun.net</a>><br>
Content-Type: text/plain; charset=ISO-8859-7<br>
<br>
On Sat, 24 Apr 2021 11:33:31 +0200, Sean Charles (emacstheviking) wrote:<br>
> [...] now I have two sets of DCG rules to port from SWI Prolog and I<br>
> just don’t know where to start. [...]<br>
<br>
<br>
There are a couple of problems: partical data structures and<br>
nondeterminism. If the DCG is for a formal language (ie programming<br>
code) then it is better to rewrite the parser, for example using<br>
`continuation passing' (I think it's called).<br>
<br>
To implement a DCG in Mercury you need to have solutions/2 at the top,<br>
and then make all the `grammar rules' nondet. Constructing the output<br>
holistically, as is/was common in DCGs, does not work (unless it has<br>
been added in the twenty years or so since I tried it).<br>
<br>
But to begin with you can just remove all the output parameters from<br>
the DCG, and then look at that problem after the parsing works.<br>
<br>
There are some minor advantages compared to Prolog, e.g. you can write<br>
Kleene operators (star, plus, question mark) to make things<br>
prettier. This has been discussed here before I believe.<br>
<br>
/Tomas<br>
<br>
<br>
------------------------------<br>
<br>
Message: 3<br>
Date: Sat, 24 Apr 2021 21:53:09 +1000 (AEST)<br>
From: Julien Fischer <<a href="mailto:jfischer@opturion.com" target="_blank" rel="noreferrer">jfischer@opturion.com</a>><br>
To: "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>><br>
Cc: users <<a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a>><br>
Subject: Re: [m-users.] DCG-s in Mercury<br>
Message-ID: <<a href="mailto:af1d114b-c9a3-91f0-b364-744d1b7a5033@opturion.com" target="_blank" rel="noreferrer">af1d114b-c9a3-91f0-b364-744d1b7a5033@opturion.com</a>><br>
Content-Type: text/plain; charset="utf-8"; Format="flowed"<br>
<br>
<br>
Hi Sean,<br>
<br>
On Sat, 24 Apr 2021, Sean Charles (emacstheviking) wrote:<br>
<br>
> Is there anywhere to be found a short, concise example of how to<br>
> create a DCG rule, just so I can see some examples of the mode<br>
> declarations, mine are not going to be used as generators, just as a<br>
> lever and a parser/AST builder. I use phrase_from_file/3 in SWI<br>
> Prolog, and the debugger means I can step through any rules that<br>
> aren’t doing what I think. So far in mercury I have not even worked<br>
> out how to start calling the head rule, if you call it that.<br>
<br>
Have a look at samples/calculator.m in the Mercury distribution.<br>
It contains an example of a parser for simple aritmetic expressions<br>
implemented using DCGs.<br>
<br>
Julien.<br>
<br>
------------------------------<br>
<br>
Message: 4<br>
Date: Sat, 24 Apr 2021 15:55:33 +0100<br>
From: "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>><br>
To: Julien Fischer <<a href="mailto:jfischer@opturion.com" target="_blank" rel="noreferrer">jfischer@opturion.com</a>><br>
Cc: users <<a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a>><br>
Subject: Re: [m-users.] DCG-s in Mercury<br>
Message-ID: <<a href="mailto:D45C65A5-292E-4CCD-A67C-057287FB0095@gmail.com" target="_blank" rel="noreferrer">D45C65A5-292E-4CCD-A67C-057287FB0095@gmail.com</a>><br>
Content-Type: text/plain;       charset=utf-8<br>
<br>
Brilliant!<br>
<br>
Thank you Julien.<br>
<br>
> On 24 Apr 2021, at 12:53, Julien Fischer <<a href="mailto:jfischer@opturion.com" target="_blank" rel="noreferrer">jfischer@opturion.com</a>> wrote:<br>
> <br>
> <br>
> Hi Sean,<br>
> <br>
> On Sat, 24 Apr 2021, Sean Charles (emacstheviking) wrote:<br>
> <br>
>> Is there anywhere to be found a short, concise example of how to<br>
>> create a DCG rule, just so I can see some examples of the mode<br>
>> declarations, mine are not going to be used as generators, just as a<br>
>> lever and a parser/AST builder. I use phrase_from_file/3 in SWI<br>
>> Prolog, and the debugger means I can step through any rules that<br>
>> aren’t doing what I think. So far in mercury I have not even worked<br>
>> out how to start calling the head rule, if you call it that.<br>
> <br>
> Have a look at samples/calculator.m in the Mercury distribution.<br>
> It contains an example of a parser for simple aritmetic expressions<br>
> implemented using DCGs.<br>
> <br>
> Julien.<br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 5<br>
Date: Sat, 24 Apr 2021 20:56:56 +0100<br>
From: "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>><br>
To: users <<a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a>><br>
Subject: [m-users.] getopt_io return value type on success?<br>
Message-ID: <<a href="mailto:41AECD75-D420-4E49-B2BD-588FFF353383@gmail.com" target="_blank" rel="noreferrer">41AECD75-D420-4E49-B2BD-588FFF353383@gmail.com</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Hi,<br>
<br>
I have managed to implement a working command line but I am struggling to figure out how to return the ok(X) value to my caller, I have written a predicate that I call from main():<br>
<br>
    :- pred do_command_line(<br>
            list(string)::out,<br>
            getopt_io.option_table(?)::out,<br>
            io::di, io::uo<br>
     ) is det.<br>
<br>
<br>
I know that ok(X) indicates an option table is now open to being queried etc but I can’t work out what actual type I need to use. I want to pass this object into the following code so that it can act on the various settings that were specified. The declaration of option_table is:<br>
<br>
:- type option_table(OptionType) == map(OptionType, option_data).<br>
<br>
But I have so far failed to make the mental connection between whatever is in OptionType and the fact that my options look like this:<br>
<br>
:- pred short_option(char::in, option::out) is semidet.<br>
<br>
short_option('h', help).<br>
short_option('v', version).<br>
short_option('w', code_wrap).<br>
short_option('s', syntax_check).<br>
short_option('t', target).<br>
short_option('T', list_targets).<br>
short_option('o', output).<br>
short_option('p', packed).<br>
short_option('e', error_mode).<br>
<br>
I want to just call, from main(),<br>
<br>
        do_command_line(FileNames, Options, !IO),<br>
<br>
But I don’t know what type to make `Options`.<br>
<br>
Thank you.<br>
Sean<br>
<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="http://lists.mercurylang.org/archives/users/attachments/20210424/178404e0/attachment-0001.html" rel="noreferrer noreferrer" target="_blank">http://lists.mercurylang.org/archives/users/attachments/20210424/178404e0/attachment-0001.html</a>><br>
<br>
------------------------------<br>
<br>
Message: 6<br>
Date: Sun, 25 Apr 2021 06:26:51 +1000 (AEST)<br>
From: "Zoltan Somogyi" <<a href="mailto:zoltan.somogyi@runbox.com" target="_blank" rel="noreferrer">zoltan.somogyi@runbox.com</a>><br>
To: "Sean Charles" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>><br>
Cc: users <<a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a>><br>
Subject: Re: [m-users.] getopt_io return value type on success?<br>
Message-ID: <E1laOrb-0007a9-W5@rmmprod07.runbox><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
<br>
<br>
On Sat, 24 Apr 2021 20:56:56 +0100, "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>> wrote:<br>
> But I don’t know what type to make `Options`.<br>
<br>
That type should have one alternative for each of the options<br>
of your program.<br>
<br>
There are several examples of how to use getopt<br>
in the extras directory. Have a look at them.<br>
<br>
Zoltan.<br>
<br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 7<br>
Date: Sat, 24 Apr 2021 21:34:44 +0100<br>
From: "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>><br>
To: Zoltan Somogyi <<a href="mailto:zoltan.somogyi@runbox.com" target="_blank" rel="noreferrer">zoltan.somogyi@runbox.com</a>><br>
Cc: users <<a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a>><br>
Subject: Re: [m-users.] getopt_io return value type on success?<br>
Message-ID: <<a href="mailto:E9690DDC-0C51-4312-ABAC-88BC324485C8@gmail.com" target="_blank" rel="noreferrer">E9690DDC-0C51-4312-ABAC-88BC324485C8@gmail.com</a>><br>
Content-Type: text/plain;       charset=utf-8<br>
<br>
Bingo!<br>
<br>
The penny has dropped, I looked at the align_right.m sample (useful code to read) and saw how to parameterise the type.<br>
<br>
Thanks Zoltan!<br>
<br>
It’s the journey not the destination.<br>
Getting there one day would be nice.  :)<br>
<br>
> On 24 Apr 2021, at 21:26, Zoltan Somogyi <<a href="mailto:zoltan.somogyi@runbox.com" target="_blank" rel="noreferrer">zoltan.somogyi@runbox.com</a>> wrote:<br>
> <br>
> <br>
> <br>
> On Sat, 24 Apr 2021 20:56:56 +0100, "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" target="_blank" rel="noreferrer">objitsu@gmail.com</a>> wrote:<br>
>> But I don’t know what type to make `Options`.<br>
> <br>
> That type should have one alternative for each of the options<br>
> of your program.<br>
> <br>
> There are several examples of how to use getopt<br>
> in the extras directory. Have a look at them.<br>
> <br>
> Zoltan.<br>
> <br>
> <br>
<br>
<br>
<br>
------------------------------<br>
<br>
Subject: Digest Footer<br>
<br>
_______________________________________________<br>
users mailing list<br>
<a href="mailto:users@lists.mercurylang.org" target="_blank" rel="noreferrer">users@lists.mercurylang.org</a><br>
<a href="https://lists.mercurylang.org/listinfo/users" rel="noreferrer noreferrer" target="_blank">https://lists.mercurylang.org/listinfo/users</a><br>
<br>
<br>
------------------------------<br>
<br>
End of users Digest, Vol 80, Issue 9<br>
************************************<br>
</blockquote></div>