[gambit-list] three questions regarding gambit low level

Hendrik Boom hendrik at topoi.pooq.com
Sat Dec 21 08:48:14 EST 2019


On Sat, Dec 21, 2019 at 07:20:32AM -0500, Marc Feeley wrote:
> Hello Jorg,
> 
> > On Dec 17, 2019, at 8:30 AM, Jörg F. Wittenberger <Joerg.Wittenberger at softeyes.net> wrote:
> > 
> > Hi all,

> 
> With the default thread scheduler, or the SMP thread scheduler when there is a single processor (runtime option -:p1) you can disable the scheduler’s thread preemption interrupt by using the (declare (not interrupts-enabled)) declaration.  When that declaration is in effect, the compiler will no longer add interrupt checking code in the generated code. Note however that if there is a call to a procedure that wasn’t compiled with this declaration then the thread scheduler may interrupt its execution.
> Moreover disabling interrupt checking is tricky because stack overflows are 
> detected using the same mechanism, so you have to make sure the code does not 
> add more than a few stack frames.

I conclude that tail-calls will not add stack frames, not even temporary ones that 
can get garbage-collected when the stack is full.  Otherwise this won't work.

> 
> > 
> > 2. Defining yet another record type.  Much like SRFI-9 just two actual
> > slots per record field, the value and a version tag.  Likely doable, but
> > the tricky part: how do I hide the version tag accessors from user code?
> 
> Gambit’s define-type can assign various properties to the fields, including whether the field is printed or not, whether the field is read-only, whether its content is checked by the equal? procedure, what the initial value of the field is, etc
> 
> A plain definition of a 2d point record can be done like this:
> 
> (define-type point
>   x
>   y)
> 
> It implicitly defines the procedures make-point, point-copy, point?, point-x, point-x-set!, point-x-set, point-y, point-y-set!, point-y-set.  Both fields will be shown when a point is printed:
> 
> > (make-point 1 2)
> #<point #2 x: 1 y: 2>
> 
> If you want two other hidden fields for the version tags of x and y, you could define the record like this:
> 
> (define-type point
>   x
>   y
>   (x-version unprintable: equality-skip: no-functional-setter: init: #f)
>   (y-version unprintable: equality-skip: no-functional-setter: init: #f))

As I always wonder with Racket, I find myself wondering how much of this stuff
is standard Scheme and how much is Gambit-specific.
It would be lovely to program in a common subset fo the two, because I like 
Gambit, but Drracket is a very convenient development environment.

-- hendrik





More information about the Gambit-list mailing list