<div dir="ltr">Thanks mark. I had considered passing around a map and then changing things in the map as and when needed.<div><br></div><div>Mostly my "game" is to learn Mercury rather than write a game, but since age 11 I realised that writing games covers just about everything a language has in terms of I/O, logic, decisions etc and it's an old habit now!  I considered "pong" but hell that's been done to death.</div><div><br></div><div>The attraction of Mercury for me for games is that it feels like a "better C", and I mean "better" in a stratospheric kind of way as Mercury has a lot to offer I think... I have also seen the Cinnabar video on YouTube and looked at the code and TBH it's nice looking code.</div><div><br></div><div>My nightmare is of producing a game in C or C++ that has a nightmare bug related to garbage/memory corruption or dangling pointers etc so my game plan (!) is to code the logical part of the game in Mercury and let my FFI wrapper for SDL shunt out the pixels.</div><div><br></div><div>Thanks all once again,</div><div>Sean.</div><div><br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 6 Aug 2019 at 08:08, Mark Brown <<a href="mailto:mark@mercurylang.org">mark@mercurylang.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Tue, Aug 6, 2019 at 3:19 AM emacstheviking <<a href="mailto:objitsu@gmail.com" target="_blank">objitsu@gmail.com</a>> wrote:<br>
><br>
> Hello,<br>
><br>
> I seem to have somehow conflated the use of the state variable form !X with the use of the modes "di" and "uo" because so far the the only place I have used such notation has been with the special !IO state variable.<br>
><br>
> I now have a game loop:<br>
><br>
> :- pred game_loop(<br>
>     app_state::di,  app_state::uo,<br>
>     game_state::di, game_state::uo,<br>
>     io::di,         io::uo)<br>
> is det.<br>
><br>
> game_loop(!AppState, !GameState, !IO) :-<br>
>      :<br>
>      : game state and app state code...<br>
>      :<br>
>     game_loop(!AppState, !GameState, !IO).<br>
><br>
> This is condensed for clarity(!) but have I understood the concepts correctly. My intention is that after one pass of the game loop the "old" (di) application and game states can be junked i.e. their memory deallocated as the new incarnations are now the current ones, ready for the tail-cail back into the next iteration of the game loop.<br>
><br>
> Is that the correct use case?<br>
><br>
> The game state will contain all the mutable stuff for the game and the application state is slightly higher level stuff like "should I terminate" etc.<br>
<br>
Hi Sean,<br>
<br>
As others have said, it's likely you will hit difficulties this way<br>
(unfortunately). I've had a fair bit of success with this kind of<br>
thing, however, by separating out parts of the data structures that<br>
are (mostly) unique and passing them via their own state variables.<br>
The recursive predicate usually ends up looking something like:<br>
<br>
    loop(Info, !State, !A1, !A2, ...)<br>
<br>
where<br>
 - Info is an 'in' argument containing parameters that don't change<br>
(including things like mutvars)<br>
 - !State is an 'in, out' argument pair that collects together all of<br>
the non-unique, changeable state<br>
 - !A1, ... are 'di, uo' (or 'mdi, muo', or 'array_di, array_uo')<br>
argument pairs, with standard library types such as array, random, io,<br>
etc.<br>
<br>
The obvious drawback is that there's no saying how many argument pairs<br>
you might end up needing to pass around, although in practice maybe<br>
that won't be too big a problem for you? (Technically there is a way<br>
around this if really needed, albeit using unsafe promises and a bit<br>
of boilerplate).<br>
<br>
Mark<br>
</blockquote></div>