<div dir="ltr">I have been hacking a good hour or two and not really made much progress for something that I thought would have been simpler, but. Ignorance!!<div><br></div><div>In my SDL2 wrapper I have a list of types that correspond to the various window creation flags, I am passing them as a list as that's the nicest way of doing it I think,</div><div><br></div><div><font face="courier new, monospace">sdl_createwindow("Test", 100, 100, 640, 480, [resizable, shown], !IO)</font><br></div><div><br></div><div>The types are declared as foreign enums in the usual way :-</div><div><font face="courier new, monospace">:- type window_flag<br>    ---> fullscreen ; opengl ; shown ; resizable ..... (elided)<br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">:- pragma foreign_enum("C", window_flag/0, [<br>    fullscreen          - "SDL_WINDOW_FULLSCREEN",<br>    opengl              - "SDL_WINDOW_OPENGL",<br>    shown               - "SDL_WINDOW_SHOWN",<br>    resizable           - "SDL_WINDOW_RESIZABLE",</font></div><div><font face="courier new, monospace">   :...(elided)<br>]).<br></font></div><div><font face="courier new, monospace" size="1"><br></font></div><div>By using the --make-target option to poke at the generated code I can see that it comes into the C code as MR_Word, not MR_Word*thought and then I tracked down the definitions of the MR_is_list_empty macros etc and realised pretty quickly that there is no "MR_get_next" as it should be as simple as pointer arithmetic but so far it has escaped my best efforts. I have seen that the array is composed as a static array of values from the MR_TAG_COMMON but I lost the trail at that point. Here is my code:</div><div><br></div><div><font face="courier new, monospace">:- pred sdl_createwindow(string::in, int::in, int::in, int::in, int::in, list(window_flag)::in, io::di, io::uo) is det.<br>:- pragma foreign_proc("C",<br>    sdl_createwindow(Title::in, X::in, Y::in, W::in, H::in, Flags::in, _IO0::di, _IO::uo),<br>    [promise_pure,will_not_call_mercury,does_not_affect_liveness],<br>"<br>Uint32 flags = 0;<br>if (Flags) {<br>    MR_Word* flagPtr = &Flags;<br>    while(!MR_list_is_empty(*flagPtr)) {<br>        Uint32 f = MR_list_head(*flagPtr);</font></div><div><font face="courier new, monospace">        flags |= f;<br>        printf(""FLAGS: %u\\n"", flags);<br>        flagPtr++;<br>    }<br>}<br>SDL_Window* wnd = SDL_CreateWindow(Title, X, Y, W, H, flags);<br>").<br></font></div><div><br></div><div>I just want to iterate the list of types and OR together the final bit flag uint32 value and get on with creating the window. This is something that is going to crop up again and again in various parts of the library. I am pretty sure I will figure out immediately hitting send.....</div><div><br></div><div>Thanks in advance,</div><div>Sean.</div><div><br></div></div>