<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;">Hi,<div><br></div><div>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.</div><div><br></div><div>I have this as the callback definition:</div><div><br></div><div><div><br></div><div><font face="FiraCode-Regular">:- type callback == (pred(world, world, io, io)).</font></div><div><font face="FiraCode-Regular">:- inst callback == (pred(in, out, di, uo) is det).</font></div><div><font face="FiraCode-Regular"><br></font></div><div><font face="FiraCode-Regular">:- pred run_loop(</font></div><div><font face="FiraCode-Regular">    callback::in, world::in, world::out, io::di, io::uo</font></div><div><font face="FiraCode-Regular">) is det.</font></div></div><div><br></div><div>My call site code looks like this, nothing spectacular:</div><div><br></div><div><div><font face="FiraCode-Regular">:- pred app_loop(world::in, world::out, io::di, io::uo) is det.</font></div><div><font face="FiraCode-Regular"><br></font></div><div><font face="FiraCode-Regular">app_loop(!W, !IO) :-</font></div></div><div><font face="FiraCode-Regular"> % do stuff</font></div><div><font face="FiraCode-Regular"> .</font></div><div><br></div><div>The game loop set up and call is this:</div><div><br></div><div><div><font face="FiraCode-Regular">    mk_world(60, World, !IO),</font></div><div><font face="FiraCode-Regular">    run_loop(app_loop, World, _, !IO),</font></div><div><font face="FiraCode-Regular">    close_window(!IO).</font></div></div><div><br></div><div>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:</div><div><br></div><div><div><font face="FiraCode-Regular">run_loop(AppHandler, !W, !IO) :-</font></div><div><font face="FiraCode-Regular">    window_should_close(X, !IO),</font></div><div><font face="FiraCode-Regular">    (</font></div><div><font face="FiraCode-Regular">        X = yes,</font></div><div><font face="FiraCode-Regular">        trace_info("Stopped by user", [], !IO)</font></div><div><font face="FiraCode-Regular">    ;</font></div><div><font face="FiraCode-Regular">        X = no,</font></div></div><div><font face="FiraCode-Regular">           :</font></div><div></div><div><font face="FiraCode-Regular">           :</font></div><div></div><div><font face="FiraCode-Regular">        %%%%%%%%%%</font></div><div><div><font face="FiraCode-Regular">        % RENDER %</font></div><div><font face="FiraCode-Regular">        %%%%%%%%%%</font></div><div><font face="FiraCode-Regular">        begin_drawing(!IO),</font></div><div><font face="FiraCode-Regular">193:        AppHandler(!W, !IO),</font></div><div><font face="FiraCode-Regular">194:    end_drawing(!IO),</font></div><div><font face="FiraCode-Regular">195:</font></div><div><font face="FiraCode-Regular">196:    run_loop(AppHandler, !W, !IO)</font></div></div><div><font face="FiraCode-Regular">    ).</font></div><div><br></div><div>The compiler error centres around line 196, which I wasn't expecting, of course!</div><div><br></div><div><div><font face="FiraCode-Regular">ui.m:196: In clause for `run_loop(in, in, out, di, uo)':</font></div><div><font face="FiraCode-Regular">ui.m:196:   mode error in conjunction. The next 3 error messages indicate</font></div><div><font face="FiraCode-Regular">ui.m:196:   possible causes of this error.</font></div><div><font face="FiraCode-Regular">ui.m:196:   </font></div><div><font face="FiraCode-Regular">ui.m:193:   In clause for `run_loop(in, in, out, di, uo)':</font></div><div><font face="FiraCode-Regular">ui.m:193:   in argument 1 (i.e. the predicate term) of higher-order predicate</font></div><div><font face="FiraCode-Regular">ui.m:193:   call:</font></div><div><font face="FiraCode-Regular">ui.m:193:   mode error: variable `AppHandler' has instantiatedness `ground',</font></div><div><font face="FiraCode-Regular">ui.m:193:   expecting higher-order pred inst of arity 4.</font></div><div><font face="FiraCode-Regular">ui.m:196:   </font></div><div><font face="FiraCode-Regular">ui.m:194:   In clause for `run_loop(in, in, out, di, uo)':</font></div><div><font face="FiraCode-Regular">ui.m:194:   in argument 1 of call to predicate `raylib.end_drawing'/2:</font></div><div><font face="FiraCode-Regular">ui.m:194:   unique-mode error: the called procedure would clobber its argument,</font></div><div><font face="FiraCode-Regular">ui.m:194:   but variable `STATE_VARIABLE_IO_29' is still live.</font></div><div><font face="FiraCode-Regular">ui.m:196:   </font></div><div><font face="FiraCode-Regular">ui.m:196:   In clause for `run_loop(in, in, out, di, uo)':</font></div><div><font face="FiraCode-Regular">ui.m:196:   in argument 4 of call to predicate `ui.run_loop'/5:</font></div><div><font face="FiraCode-Regular">ui.m:196:   unique-mode error: the called procedure would clobber its argument,</font></div><div><font face="FiraCode-Regular">ui.m:196:   but variable `STATE_VARIABLE_IO_30' is still live.</font></div></div><div><br></div><div><br></div><div>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.</div><div><br></div><div>Seeking explanation!</div><div><br></div><div>Thanks again,.</div><div>Sean.</div><div><br></div><div><br></div></body></html>