[gambit-list] os_dyn

Marc Feeley feeley at iro.umontreal.ca
Mon Oct 5 09:57:11 EDT 2009


On 5-Oct-09, at 7:20 AM, Michele Zaffalon wrote:

> Hi,
>
> I have found the following remark by Marc in one of the posts,
>
> On some platforms (processor and operating system dependent) that can
> execute dynamically generated machine code (32 bit intel, power-pc,
> sparc), you can pass any procedure including closures.  This feature
> is enabled if USE_dynamic_code_gen is defined in lib/os_dyn.h and this
> is the default in recent versions of Gambit.  Give it a try... it may
> work to pass a closure on your platform... but don't count on it to be
> portable!
>
> Could somebody explain how it works?

It used to work!  I noticed a stupid bug in lib/os_dyn.c .  You have  
to replace all the ___WORD_SIZE by ___WORD_WIDTH and then recompile  
the system with "make".

Then, on supported platforms such as 32 bit intel, you'll be able to  
run code like this which passes a closure to a foreign function:

(c-declare "

int f( int g( int x ) )
{ return g(1) + g(2); }

")

(define f (c-lambda ((function (int) int)) int "f"))

(c-define (square n) (int) int "square" ""
   (* n n))

(pp (square 10)) ;; prints 100

(pp (f square)) ;; prints 5 (i.e. 1^2 + 2^2)

(pp (f (lambda (x) (expt 2 x)))) ;; prints 6 (i.e. 2^1 + 2^2)

It is the last expression, i.e. the call (f (lambda (x) (expt 2 x))),  
which is enabled by the dynamic code generation.  The call (f square)  
is always supported because it does not require dynamic code  
generation (because square is defined with a c-define form).

Marc




More information about the Gambit-list mailing list