[m-users.] IO argument clobbering

Sean Charles (emacstheviking) objitsu at gmail.com
Tue Jul 18 01:26:10 AEST 2023


[A]  :- type callback == (pred(world, world, io, io)).
[B]  :- inst callback == (pred(in, out, di, uo) is det).

[C]  :- pred run_loop(
      callback::in(callback), world::in, world::out, io::di, io::uo
  ) is det.

In an attempt to demystify it all then, at point [A] I am defining an equivalence type which is merely a Mercury way of defining something similar to a C preprocessor macro in that the use of callback *as a type* specified will just cause the compiler to use the value on the right hand side of '=='. That much I understand, I think!

At [B], I am defining an instantiatedness tree, that although it has the same name as that used at [A], bears no actual relationship to it in any way.

At [C], I am declaring that run_loop/5 is a predicate that takes an argument of *type* callback, and that that it is an input, and that the input MUST have the instantiatedness defined by the definition at [B], the first use of callback being the type, and the in(callback) is stating that the value MUST be ground i.e. contain no free variables.

Is that not even wrong, or close?

Despite it making me feel dumber than dumb, I continue to love Mercury for all that it offers! I did not have the luxury of doing a 'comp-sci degree' in my youth, I am self-taught which, whilst fun, can at times be so desparately discouraging when the manual content is written in such high-level language. If it wasn't for the high calibre and warmth of this mailing list I think I may have given up in my first month with mercury, a few years ago now!

:D

Thanks.



> On 17 Jul 2023, at 16:07, Volker Wysk <post at volker-wysk.de> wrote:
> 
> Am Montag, dem 17.07.2023 um 15:52 +0100 schrieb Sean Charles
> (emacstheviking):
>> Zoltan, Volker...... yes!
>> 
>> That makes it compile and run just fine.... I am not sure I fully comprehend but I will go and RTFM some more, that might help.
> 
> "in" is an abbreviation for "in(ground)". "ground" means normal data,
> nothing callable. A predicate isn't ground. Its inst is like you have
> defined it in your ":- inst callback == ...".
> 
> Cheers,
> Volker
> 
>> 
>> Thank you both.
>> 
>> 
>>> On 17 Jul 2023, at 15:37, Zoltan Somogyi <zoltan.somogyi at runbox.com> wrote:
>>> 
>>> 
>>> On 2023-07-17 16:27 +02:00 CEST, "Sean Charles (emacstheviking)" <objitsu at gmail.com> wrote:
>>>> :- type callback == (pred(world, world, io, io)).
>>>> :- inst callback == (pred(in, out, di, uo) is det).
>>>> 
>>>> :- pred run_loop(
>>>>   callback::in, world::in, world::out, io::di, io::uo
>>>> ) is det.
>>> 
>>> Without compileable example code I cannot be sure, but I think
>>> the problem is the "callback::in" in the declaration of run_loop.
>>> What happens when you replace it with "callback:in(callback)"?
>>> The mode checker needs this to tell it the mode of the higher order arg.
>>> 
>>> Zoltan.
>> 
>> _______________________________________________
>> users mailing list
>> users at lists.mercurylang.org <mailto:users at lists.mercurylang.org>
>> https://lists.mercurylang.org/listinfo/users
> 
> _______________________________________________
> users mailing list
> users at lists.mercurylang.org <mailto:users at lists.mercurylang.org>
> https://lists.mercurylang.org/listinfo/users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/users/attachments/20230717/00d0c5d4/attachment.html>


More information about the users mailing list