Trouble creating SRFI-9 Record in C
Good day guile-users, I am having a struggle with SRFI-9 records. They look very convenient, so i'd like to use them in my Guile scripts. However, i'm not sure how to correctly construct them from C-land. I have something like the following: ``` (define-record-type (make-foo a b) foo? (a foo-a) (b foo-b)) ``` In Guile land, that works great. Now, i want to create a foo in C and pass it to a function in the Guile script. I do something like the following: ``` scm_c_primitive_load("foo.scm"); scm_call_5(scm_variable_ref(scm_c_lookup("make-foo")), scm_from_utf8_string("blah"), scm_from_int32(Int32(42))) ``` However, this results in an error: guile: uncaught exception: Wrong type to apply: # I've tried with and without (define-module foo) at the top of the file, that doesn't seem to make a difference. I've been able to work around the issue by defining a wrapper (define (foo-prime a b) (make-foo a b)) and using that in C as shown above, but that feels ugly. I'm probably missing something obvious, but trawling the mailing list didn't turn up anything i could understand. Does anyone see what i'm doing wrong, or can i simply not use SRFI-9 records in this way? Thanks, 🙌 p.
Re: Trouble creating SRFI-9 Record in C
On Sat, 11 Sep 2021, paul wrote: > In Guile land, that works great. Now, i want to create a foo in C > and pass it to a function in the Guile script. I do something > like the following: > > ``` > scm_c_primitive_load("foo.scm"); > scm_call_5(scm_variable_ref(scm_c_lookup("make-foo")), >scm_from_utf8_string("blah"), >scm_from_int32(Int32(42))) > ``` > > However, this results in an error: > > guile: uncaught exception: > Wrong type to apply: # Seems like `make-foo` is a syntax-transformer and not a procedure. You can not call a syntax-transformer. I don't think you can do much with a syntax-transformer in C. > > I've tried with and without (define-module foo) at the top of the > file, that doesn't seem to make a difference. I've been able to > work around the issue by defining a wrapper (define (foo-prime a > b) (make-foo a b)) and using that in C as shown above, but that > feels ugly. I'm probably missing something obvious, but trawling > the mailing list didn't turn up anything i could understand. By making a wrapper, you're effectively creating a procedure that can use the `make-foo` syntax because it's in Scheme and it's solved a expansion time. -- Olivier Dion Polymtl