Re: Parameterizing inline C code
"felix.winkelmann--- via Chicken-users" <[email protected]>
| Newsgroups | gmane.lisp.scheme.chicken |
|---|---|
| Message-ID | <[email protected]> |
> the syntax #> ... <# allows us to inline C code in CHICKEN code. Can I
> "parameterize" it?
>
> I'd like to have something like this:
>
> (begin-for-syntax
> (define count 0)
>
> (define (foo-transformer x r c)
> (let ((name (generate-function-name x)))
> #>
> void ,name(void) {
> printf("hello world: %s\n", c_special_func(,name));
> }
> <#
> )
> )
>
> (define-syntax foo
> (er-macro-transformer foo-transformer))
>
> (foo 1) ;; creates void foo_1(void) {...}
> (foo 2) ;; creates void foo_2(void) {...}
> ...
>
> I know that using define-external I could define a function foo_n and then
> using foreign-safe-lambda* in the function definition of define-external
> I could adapt the body as well. But that will add a lot of CHICKEN
> bookkeeping and function calls. In my case I really just want a plain
> C function to be generated.
"#> ... <#" is just sugar for "foreign-declare", so nothing prevents you from
having a macro that constructs a string of arbitrary C code and expanding
into a "foreign-declare" form. In the example above, you would probably
replace the inner #> ... <# with something like
(let ((fd (r 'foreign-declare)))
`(,fd ,(format "void ~a(void) { ... }" name)))
felix