[m-users.] IO argument clobbering
Sean Charles (emacstheviking)
objitsu at gmail.com
Tue Jul 18 00:27:25 AEST 2023
Hi,
I am trying to pass a predicate to a rendering loop so the loop can manage the system but call back each frame to get the application to render its state.
I have this as the callback definition:
:- 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.
My call site code looks like this, nothing spectacular:
:- pred app_loop(world::in, world::out, io::di, io::uo) is det.
app_loop(!W, !IO) :-
% do stuff
.
The game loop set up and call is this:
mk_world(60, World, !IO),
run_loop(app_loop, World, _, !IO),
close_window(!IO).
The idea was that, at that point, the 'control' of the application is managed by my emerging framework, dare I call it that, and I wanted to be able to pass in various callbacks, starting with basic frame rendering, the implementation code is this:
run_loop(AppHandler, !W, !IO) :-
window_should_close(X, !IO),
(
X = yes,
trace_info("Stopped by user", [], !IO)
;
X = no,
:
:
%%%%%%%%%%
% RENDER %
%%%%%%%%%%
begin_drawing(!IO),
193: AppHandler(!W, !IO),
194: end_drawing(!IO),
195:
196: run_loop(AppHandler, !W, !IO)
).
The compiler error centres around line 196, which I wasn't expecting, of course!
ui.m:196: In clause for `run_loop(in, in, out, di, uo)':
ui.m:196: mode error in conjunction. The next 3 error messages indicate
ui.m:196: possible causes of this error.
ui.m:196:
ui.m:193: In clause for `run_loop(in, in, out, di, uo)':
ui.m:193: in argument 1 (i.e. the predicate term) of higher-order predicate
ui.m:193: call:
ui.m:193: mode error: variable `AppHandler' has instantiatedness `ground',
ui.m:193: expecting higher-order pred inst of arity 4.
ui.m:196:
ui.m:194: In clause for `run_loop(in, in, out, di, uo)':
ui.m:194: in argument 1 of call to predicate `raylib.end_drawing'/2:
ui.m:194: unique-mode error: the called procedure would clobber its argument,
ui.m:194: but variable `STATE_VARIABLE_IO_29' is still live.
ui.m:196:
ui.m:196: In clause for `run_loop(in, in, out, di, uo)':
ui.m:196: in argument 4 of call to predicate `ui.run_loop'/5:
ui.m:196: unique-mode error: the called procedure would clobber its argument,
ui.m:196: but variable `STATE_VARIABLE_IO_30' is still live.
I don't understand what it means by 'still live'. I am threading the !IO world state through this run loop, passing it into the callback code, but on the tail-back into the next iteration, well, I don't understand what the actual issue is.
Seeking explanation!
Thanks again,.
Sean.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/users/attachments/20230717/921403e9/attachment.html>
More information about the users
mailing list