[gambit-list] Any way to reach generic + etc. from code with (declare (fixnum))
Marc Feeley
feeley at iro.umontreal.ca
Thu Nov 14 16:54:03 EST 2013
It appears to be a bug... the expansion (i.e gsc -expansion ...), which contains a call to + and not to fx+, does not match the C code generated which contains a call to fx+. I suspect an overly agressive optimization (function specialization). I will look into it. But the example Scheme code I gave is the correct way to achieve what you want.
Marc
On Nov 14, 2013, at 3:53 PM, Mikael <mikael.rcv at gmail.com> wrote:
>
>
>
> 2013/11/4 Marc Feeley <feeley at iro.umontreal.ca>
>
> On Nov 3, 2013, at 10:01 PM, Mikael <mikael.rcv at gmail.com> wrote:
>
> > Dear Marc,
> >
> > The procedure ordinarily reached as + , can it be reached under some alternative name in code with (declare (fixnum)) ?
>
> Here's how I would do it:
>
> (declare (standard-bindings) (fixnum) (not safe))
>
> (define (double1 x)
> (+ ;; uses fixnum specific + (i.e. ##fx+)
> x
> x))
>
> (define (double2 x)
> ((let () (declare (generic)) +) ;; uses generic +
> x
> x))
>
> You could also call the procedure ##+, but it is not an exact replacement for + because the error handling is different (try (##+ 1 'foo)) and it must be passed 2 parameters.
>
> Marc
>
>
> Weird, I tried for this x.scm :
>
> (declare (standard-bindings) (fixnum))
> (define x 97650736685728012900)
> ((let () (declare (generic)) +)
> x
> 1)
>
>
> and it still goes:
>
> $ gsc
> Gambit v4.7.0
>
> > (load "x.scm")
> "x.scm"
> > ,q
> $ gsc
> Gambit v4.7.0
>
> > (compile-file "x.scm")
> "x.o1"
> > (load "x.o1")
> *** ERROR IN ##load -- (Argument 1) FIXNUM expected
> (fx+ 97650736685728012900 1)
> 1>
>
> I get the same result when compiling the double2 example in your email above.
>
> I tried adding another let around the +, did not resolve it.
>
> How fix?
>
> Thanks,
> Mikael
More information about the Gambit-list
mailing list