<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">SOLVED, I think…. Ui and do were not what I wanted after all, I changed the list to be just ‘in’ and ‘out’ and the code that adds to the accumulator is as follows, after reading the list module predicate declarations,<div class=""><br class=""><font face="Courier" class="">translate_(Options, [File|Files], !Acc, !IO) :-<br class="">        trace [<br class="">            run_time(env("FELT_DBG")),<br class="">            io(!Dbg)<br class="">        ]<br class="">        (io.format("translate_: %s\n", [s(File)], !Dbg)),<br class=""><br class="">    !:Acc = [File| !.Acc],<br class="">    translate_(Options, Files, !Acc, !IO).<br class=""></font><br class=""></div><div class="">This now feels much better. I guess deep down in the compiler code, ‘destructive’ literally means overwriting the memory.</div><div class=""><br class=""></div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 6 May 2021, at 08:23, Sean Charles (emacstheviking) <<a href="mailto:objitsu@gmail.com" class="">objitsu@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">Morning!</div><div class=""><br class=""></div><div class="">I thought about it and I now have this which compiles and seems to work and ‘feels correct’ (!) but I am aware of the ‘mostly unique’ modes as well but in this case I don’t think that’s what I need, the purpose of the accumulator is to collect errors.</div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class="">translate(Files, Options, !IO) :-<br class="">    translate_(Options, Files, [], Errors, !IO),<br class="">    io.print_line(Errors, !IO).<br class=""><br class=""><br class="">:- pred translate_(<br class="">    command_line.felt_options::in,<br class="">    list(string)::in,<br class="">    list(string)::di, list(string)::uo,<br class="">    io::di, io::uo) is det.<br class=""><br class="">translate_(_, [], !_Acc, !IO) :-<br class="">        trace [<br class="">            run_time(env("FELT_DBG")),<br class="">            io(!Dbg)<br class="">        ]<br class="">        (io.format("translate_: all done\n", [], !Dbg)).<br class=""><br class="">translate_(Options, [File|Files], !Acc, !IO) :-<br class="">        trace [<br class="">            run_time(env("FELT_DBG")),<br class="">            io(!Dbg)<br class="">        ]<br class="">        (io.format("translate_: %s\n", [s(File)], !Dbg)),<br class="">    translate_(Options, Files, !Acc, !IO).<br class=""></font><br class=""></div><div class=""><br class=""></div><div class="">It dawned on me that my accumulator is in some sense the same as a state variable and thus requires handling as such; so I realised that if I used that `!` syntax then I could do what I wanted. I think I did the right thing, the compiler is happy but.. am I ?</div><div class=""><br class=""></div><div class="">Again, thanks for your time Zoltan.</div><div class="">Sean</div><div class=""><br class=""></div><br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On 6 May 2021, at 08:20, Sean Charles (emacstheviking) <<a href="mailto:objitsu@gmail.com" class="">objitsu@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">I read this page for a good time now:<br class=""><br class=""><a href="https://mercurylang.org/information/doc-latest/mercury_ref/Predicate-and-function-mode-declarations.html#Predicate-and-function-mode-" class="">https://mercurylang.org/information/doc-latest/mercury_ref/Predicate-and-function-mode-declarations.html#Predicate-and-function-mode-</a>declarations<br class=""><br class="">…with the relevant part being:<br class=""><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><br class="">>A function or predicate mode declaration is an assertion by the programmer that for all possible argument terms and (if applicable) result term for the function or predicate that are approximated (in our technical sense) by the initial instantiatedness trees of the mode declaration and all of whose free variables are distinct, if the function or predicate succeeds, then the resulting binding of those argument terms and (if applicable) result term will in turn be approximated by the final instantiatedness trees of the mode declaration, with all free variables again being distinct. We refer to such assertions as mode declaration constraints. These assertions are checked by the compiler, which rejects programs if it cannot prove that their mode declaration constraints are satisfied.</blockquote><br class="">That’s a wake up call. Up to this point I had not made the connection between the declared determinism and the modes. It’s a lot to take in and it’s too late for my brain. I guess in the morning I will read it again and work on it. I am not schooled in predicate logic or maths; what I know I have taught myself as and when I need to for 35 years and counting but Mercury (and Prolog) continue to be most challenging. When you don’t know what half of the documentation is saying because the language is so hard to interpret into something meaningful to a mere mortal it feels very hard at times. But I haven’t given up thus far, the code I have feels incredibly lean and safe. Very reassuring actually.<br class=""><br class="">Any links to learning resources that might help me on the way would be nice to see.<br class=""><br class="">Good night!<br class="">Sean<br class=""><br class=""><br class=""><br class=""><br class=""><br class=""><blockquote type="cite" class="">On 5 May 2021, at 23:00, Zoltan Somogyi <<a href="mailto:zoltan.somogyi@runbox.com" class="">zoltan.somogyi@runbox.com</a>> wrote:<br class=""><br class=""><br class=""><br class="">On Wed, 5 May 2021 22:55:11 +0100, "Sean Charles (emacstheviking)" <<a href="mailto:objitsu@gmail.com" class="">objitsu@gmail.com</a>> wrote:<br class=""><blockquote type="cite" class="">:- pred translate_(<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span>command_line.felt_options::in,<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>list(string)::in,<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span>list(string)::out,<br class=""><span class="Apple-tab-span" style="white-space:pre">     </span>io::di, io::uo) is det.<br class=""></blockquote><br class="">This promises that when translate_ succeeds, the third arg<br class="">will be ground, but ...<br class=""><br class=""><blockquote type="cite" class="">translate_(_, [], _Acc, !IO) :-<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>trace [<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">    </span>run_time(env("FELT_DBG")),<br class=""><span class="Apple-tab-span" style="white-space:pre">   </span><span class="Apple-tab-span" style="white-space:pre">    </span>io(!Dbg)<br class=""><span class="Apple-tab-span" style="white-space:pre">       </span>]<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span>(io.format("translate_: all done\n", [], !Dbg)).<br class=""></blockquote><br class="">... as the error message says, this clause does NOT make it ground.<br class=""><br class="">Zoltan.<br class=""><br class=""><br class=""></blockquote><br class=""></div></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div></body></html>