[gambit-list] c-lambda behaviour...

Marc Feeley feeley at iro.umontreal.ca
Wed Mar 26 16:04:40 EDT 2008


On 26-Mar-08, at 3:55 PM, David St-Hilaire wrote:
> Hello!
>
> In a simple example, I saw a weird or unexpected (from me) behaviour  
> from the c-lambda function. Here is what I did:
>
> (c-declare "#include <stdio.h>")
> ((c-lambda () void "printf(\"test: %d\\n\", 10);")
>
> This worked just fine, but if I do:
>
> (c-declare "#include <stdio.h>")
> ((c-lambda () void (string-append "printf(\"%d\\n\"," "10);"))
>
> I get:
>
> *** ERROR IN "/home/dave/temp/test.scm"@4.11 -- Third argument to 'c- 
> lambda' must be a string
>
> Why is that the c-lambda cannot or does not evaluate its arguments?  
> Is this occuring because c-lambda is a macro?
>
> I'd like it to evaluate my (string-append ...) because then, I could  
> simplify the usage of the ffi with macros...

The call to string-append must happen at macro-expansion time, so that  
the compiler sees the result of the string-append inside the c-lambda  
form.  So you have to use a macro to achieve this.  A quick-and-dirty  
example:

(define-macro (my-c-lambda param-types result-type body)
   `(c-lambda ,param-types ,result-type ,(eval body)))

or

(define-macro (c-lambda param-types result-type body)
   `(##c-lambda ,param-types ,result-type ,(eval body)))

Marc




More information about the Gambit-list mailing list