[m-users.] A question about in-place updating...
Sean Charles (emacstheviking)
objitsu at gmail.com
Mon Aug 28 23:59:45 AEST 2023
OK, so, I've started on the journey again... here's the smallest little example I tried, just to try to even create something that could later be used as a destructively updated instance,
104 :- type blob ---> blob(int).
105
106 :- func mk_blob1(int::in) = (blob::uo) is det.
107 mk_blob1(X) = blob(X).
108
109 :- pred blob1_info(blob::in, io::di, io::uo) is det.
110 blob1_info(B, !IO) :-
111 B = blob(Val),
112 io.format("blob: %i\n", [i(Val)], !IO).
113
114 :- func mk_blob2 = (blob::uo) is det.
115 mk_blob2 = blob(42).
116
117 :- pred blob2_info(blob::ui, io::di, io::uo) is det.
118 blob2_info(B, !IO) :-
119 B = blob(Val),
120 io.format("blob: %i\n", [i(Val)], !IO).
the compiler output is:
g1.m:107: In clause for `mk_blob1(in) = uo':
g1.m:107: mode error: argument 2 did not get sufficiently instantiated.
g1.m:107: Final instantiatedness of `HeadVar__2' was `unique(blob(ground))',
g1.m:107: expected final instantiatedness was `unique'.
g1.m:120: In clause for `blob2_info(ui, di, uo)':
g1.m:120: mode error: argument 1 did not get sufficiently instantiated.
g1.m:120: Final instantiatedness of `B' was `unique(blob(ground))',
g1.m:120: expected final instantiatedness was `unique'.
In the manual is says:
"Mode uo is used to create a unique value."
"Mode ui is used to inspect a unique value without losing its uniqueness."
"Mode di is used to deallocate or reuse the memory occupied by a value that will not be used. "
I have so far interpreted this, obviously incorrectly, that wanting to create a new 'blob' meant that the output would be 'uo' but it seems I have done something to upset the compiler regarding HeadVar__2, presumably the returned value given the error message. The second version works presumably because the number 42 is a ground value, but right now, I have no idea how I would pass in a bunch of values, mangle them and return a new instance of something that I would later want to use destructively. Learning time...
Some explanation of what I have done wrong would help as, once again, I find myself reading the section 6 content and it mostly going over my head. Ultimately, I want to be able to create a list of things, then in-place modify those things, and ultimately junk them on program exits. That's all. My problem i guess is not fully understanding what the compiler means by 'unique' and 'dead'.
Thanks,
Sean.
> On 28 Aug 2023, at 13:10, Volker Wysk <post at volker-wysk.de> wrote:
>
> Am Montag, dem 28.08.2023 um 13:02 +0100 schrieb Sean Charles
> (emacstheviking):
>> OK, I am now creating flight-path / animation / tweening system, that on
>> every iteration of the game loop, will have to process every single
>> instance of display objects and update their coordinates and set flags,
>> alpha values etc etc. The number of such objects could become high, not
>> punishingly high, for now I can't see it being more than a thousand, even
>> with a primitive particle system generating explosions using texture maps
>> it should not be massively high.
>>
>> Currently I am just 'making it work', gut I am wondering longer term about
>> what techniques might be open to me in Mercury given that it manages
>> memory, does the garbage collection for me etc. such that I can minimise
>> object allocation etc as instances are updated frame-by-frame.
>>
>> 1) When I use list.reverse(), is it a shallow or deep copy of the
>> original? I am assuming a shallow copy, with may be copy-on-write behind
>> the scenes?
>>
>> 2) If I have a list of say a thousand instances of a tween object, then as
>> I process them, they will need to be updated as I save the current value
>> in the instance along with a done flag, so either the values changes or
>> the done flag changes, either way it means that a new instance will be
>> created. Is there a way to make it so that Mercury can in-place update
>> these instances rather than allocating new ones, so that it reduces memory
>> thrashing and heap activity etc?
>>
>> It's an interesting question for me to ponder at the moment! Given all
>> that Mercury does, I am guessing that there are no ways to 'pin' a block
>> of memory such that it can then be reused over and over, I have played
>> around with bitmap but that's not really built for generic structures etc.
>> I guess if it came to the crunch I could always re-code those things that
>> need maximal performance in C but that kind of negates the reason I
>> decided to write this game in Mercury.
>
> What you describe seems to be a case for unique modes. See section 6 in the
> Language Reference Manual.
>
> Cheers,
> Volker
> _______________________________________________
> 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/20230828/bc9e5fed/attachment-0001.html>
More information about the users
mailing list