<html><head><meta http-equiv="content-type" content="text/html; charset=us-ascii"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><br id="lineBreakAtBeginningOfMessage"><div><br><blockquote type="cite"><div>On 28 Oct 2023, at 13:28, Volker Wysk <post@volker-wysk.de> wrote:</div><br class="Apple-interchange-newline"><div><meta charset="UTF-8"><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;">Am Samstag, dem 28.10.2023 um 14:24 +0200 schrieb Volker Wysk:</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><blockquote type="cite" style="font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Am Samstag, dem 28.10.2023 um 13:04 +0100 schrieb Sean Charles<br>(emacstheviking):<br><blockquote type="cite">I rewrote it like this, could it be any leaner? Asking in case I am not as<br>good as I can be yet :D !<br><br>   <span class="Apple-converted-space"> </span>384 get_class_superclass(Class, Super, !X) :-<br>   <span class="Apple-converted-space"> </span>385     ( if !.X = [ tk(Cp, Cb) | Rest ] then<br>   <span class="Apple-converted-space"> </span>386         Class = ps(Cp, Cb),<br>   <span class="Apple-converted-space"> </span>387         Super = no,<br>   <span class="Apple-converted-space"> </span>388         !:X   = Rest<br>   <span class="Apple-converted-space"> </span>389     else if !.X = [ sexp(_, [ tk(Cp, Cb), tk(Sp, Sb) ]) | Rest ]<br>then<br>   <span class="Apple-converted-space"> </span>390         Class = ps(Cp, Cb),<br>   <span class="Apple-converted-space"> </span>391         Super = yes(ps(Sp, Sb)),<br>   <span class="Apple-converted-space"> </span>392         !:X   = Rest<br>   <span class="Apple-converted-space"> </span>393     else<br>   <span class="Apple-converted-space"> </span>394         fail<br>   <span class="Apple-converted-space"> </span>395     ).<br></blockquote><br>Looks good to me.<br></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;">Hmmm... It could be made more concise by using DCG syntax. The implicit DCG</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;">state doesn't need to be a character list...</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"></div></blockquote><div><br></div><div>I mean... it was, in my original post, it was using only DCG syntax!!!</div><div><br></div><blockquote type="cite"><div><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><blockquote type="cite" style="font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><br><blockquote type="cite">I mean, it's fine but in the manual, 2.13 DCG-rules it says "As a matter<br>of style, we recommend that in future DCG notation be reserved for writing<br>parsers and sequence generators, and that state variable syntax be used<br>for passing state threads."<br><br>And I am writing a parser system so I figured it was permissible to use<br>DGC form. I have a lot more DCG code in my project... it ain't broke,<br>don't fix it!<br></blockquote><br>A DCG rule is just a predicate invocation with an implicit state variable at<br>the end. It makes syntax leaner when used properly and I don't see much<br>reason for not using it for parsers. You can also mix DCG syntax with state<br>variable syntax.<br><br></blockquote></div></blockquote><div><br></div><div>I have indeed used accumulators with DCG rules, it's just that the DCG form manages the final one for me if you like, and yes I know it doesn't have to be a character list, in this case it is a list of tokens from the lexer.  In other places I sometimes have used the =(X) and :=(X) to manage a state object, but I found it to be cumbersome at times so I stopped doing that particular thing.</div><div><br></div><div>I've also been contemplating making a command line tool out of the term-rewriting example code but something tells me not to do that yet... maybe when version one is completed I can then consider that it might be possible to clean up the code by introducing a build step however, I really do prefer looking at the code and knowing that that's it, there is no other thing to consider at that point.</div><div><br></div><div>Mercury can sometimes be hard to 'reduce' down, with other languages like Haskell, I find it very very easy to reduce things down to composable functions but as of yet, that level of skill has yet to be mine;  I did manage to write a simple parser combinator experimental thing but I had issues with the visual clarity of the code and moved on. The code also moved on, I've yet to find it again on my machine or bitbucket. I *know* I didn't imagine it.</div><div><br></div><div>My main issue was finding operators that aren't already taken, in Prolog you can pretty much define what you want within the rules eg "===>", but in Mercury you have to find something not used by any modules you've imported, I found that '//' and '**' seemed to work most of the time, or of course you can use 'foo' names in apostrophes but it just doesn't work that well for my eyes.</div><div><br></div><div>The best example I've found to date is in the config.m file of the 'mmc-doc' project by Julian Fondren from 2019.</div><div><br></div><div><br></div><div><br></div><br><blockquote type="cite"><div><blockquote type="cite" style="font-family: Helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Cheers,<span class="Apple-converted-space"> </span><br>Volker<br><br><blockquote type="cite"><blockquote type="cite">On 28 Oct 2023, at 12:05, Zoltan Somogyi <zoltan.somogyi@runbox.com><br>wrote:<br><br><br>On 2023-10-28 21:53 +11:00 AEDT, "Volker Wysk" <post@volker-wysk.de><br>wrote:<br><blockquote type="cite">I have the impression that the compiler often gives complicated error<br>messages for stupid errors...<span class="Apple-converted-space"> </span><br></blockquote><br>The two main factors influencing whether the compiler will have a<br>direct,<br>specific error message for a class of errors are<br><br>- how frequent that class of errors appears to be, and<br>- how difficult that class of errors is to isolate from other classes.<br><br>It is a sad fact of life that the people judging the frequency<br>of error classes are the compiler developers. Since their errors<br>have a different frequency distribution from other language users,<br>the work they (we) put into improving error messages usually<br>benefits us more than it benefits general users. That said, we of course<br>do try to improve messages even for errors we don't encounter<br>ourselves. (For example, I wouldn't encounter this bug, because<br>I stopped using DCGs ages ago.) Of course, this does require that<br>such problems be brought to our attention. That usually works;<br>for example, I extended the error message mmc generates<br>for references to undefined types, predicates etc with "did you mean"<br>suggestions (such as "circle" for "cirle") a few days after the m-users<br>thread about that error.<br><br>So if you get a complicated error message for an error, stupid or not,<br>you know what to do.<br><br>Zoltan.<br></blockquote><br></blockquote><br>_______________________________________________<br>users mailing list<br><a href="mailto:users@lists.mercurylang.org">users@lists.mercurylang.org</a><br><a href="https://lists.mercurylang.org/listinfo/users">https://lists.mercurylang.org/listinfo/users</a></blockquote></div></blockquote></div><br></body></html>