[gambit-list] different set! behavior in interpreted and compiled code
Marc Feeley
feeley at iro.umontreal.ca
Sun Aug 30 10:45:03 EDT 2009
On 30-Aug-09, at 8:46 AM, vasil wrote:
> Hi!
>
> Suppose I have a.scm with next code:
> ;;------------------------------------------
> (define l #f)
>
> (let ((t 0))
> (set! l (lambda (q) (pp t) (set! t q))))
> ;;------------------------------------------
>
> Then I start gsc and do next things:
>
> Gambit v4.5.1
>
>> (load "a.scm")
> ".../a.scm"
>> (l 2)
> 0
>> (l 3)
> 2
>> (compile-file "a.scm")
>> (load "a")
> ".../a.o1"
>> (l 2)
> 0
> #&2
>> (l 3)
> 2
> #&3
>
> Why in compiled code set! returns boxed value, but
> in interpreted code not?
>
> Vasil
In Scheme "The result of the `set!' expression is unspecified." In
the interpreter `set!' returns the #!void object, for which the REPL
does not produce any output. The compiler introduced a cell ("box"
type) to store the value of t, and transformed (let ((t 0))... into
(let ((t (box 0))... and (set! t q) into (set-box! t q). And the set-
box! procedure returns the box that was set, so that's what `set!'
returns in compiled code.
I could change the implementation of set-box! so that it returns #!
void, and then the result of the compiler and interpreter would be the
same. This will probably have a (very) small impact on performance.
On the other hand, you should be careful in general to avoid relying
on a particular result when the standard indicates that the result is
unspecified, and this happens in several places in the standard.
Marc
More information about the Gambit-list
mailing list