[Challenge] implementing the ambiguous operator in D

Denis Koroskin 2korden at gmail.com
Sun Sep 5 07:57:50 PDT 2010


On Sun, 05 Sep 2010 18:24:43 +0400, Philippe Sigaud  
<philippe.sigaud at gmail.com> wrote:

> 2010/9/5 Denis Koroskin <2korden at gmail.com>
>
>> On Sun, 05 Sep 2010 16:59:31 +0400, Philippe Sigaud <
>> philippe.sigaud at gmail.com> wrote:
>>
>>  But the real challenge in the SO question is the 'going back in time'
>>> part,
>>> which I have trouble to understand : how can you modify x and y  
>>> through a
>>> multiplication and a comparison?
>>>
>>>
>> It can be done using setjmp/longjmp, see C implementation for an  
>> example:
>>
>> http://homepage.mac.com/sigfpe/Computing/continuations.html
>>
>
> How can we access setjmp/longjmp in D?
>
> Anyway, I'm a bit nervous with using such a raw statement. An  
> oh-so-slightly
> wrapped equivalent for D would be better.
>
>
> Philippe

It is available after the following import:
import core.sys.posix.setjmp;

It is not defined on Windows, but I believe you can use the following  
declaration with dmd (works for ddmd):

version (Windows) {
	alias int[16] jmp_buf;
	extern (C) extern
	{
		int setjmp(ref jmp_buf env);
		void longjmp(ref jmp_buf env, int value);
	}
}

Some documentation:
http://en.wikipedia.org/wiki/Setjmp.h

Use the following struct (or make it a class) if you prefer OOP style:

struct State
{
     int save() {
         return setjmp(buf);
     }

     void restore(int status) {
         assert(status != 0);
         longjmp(buf, status);
     }

     private jmp_buf buf;
}

import std.stdio;

void main()
{
     State state;
     int result = state.save();
     if (result == 0) {
         // first time here
         writeln("state saved");
         state.restore(1);
     } else {
         assert(result == 1);
         writeln("state restored");
     }
}

The code above should print:
state saved
state restored

(not tested)


More information about the Digitalmars-d mailing list