Yeah. There's a bit of overhead in getting a SMOB set up, but, it has the advantage that you aren't keeping duplicate copies (a C copy and a Scheme copy) of your information in memory.
--- Neil Jerram <[EMAIL PROTECTED]> wrote: > Leonardo, > > Based on your replies to other people on the list, it sounds as > though > you probably want a SMOB. A SMOB is a way of passing a C pointer > (such as to an arbitrary struct) around opaquely in Scheme, and the > way to use them in quite well documented in a couple of places in the > Guile manual (1.7/CVS version): nodes "Defining New Types (Smobs)" > and > "Dia Smobs". > > In case something simpler would do, however, I've also added a few > comments below. > > Leonardo Lopes Pereira <[EMAIL PROTECTED]> writes: > > > Let me give a example. I can pass some simple data... > > > > --- scheme.scm --- > > (define number 1) > > > > --- C program --- > > #include <stdio.c> > > #include <libguile.h> > > #include <guile/gh.h> > > > > int main () > > { > > int number > > SCM s_symbol, s_value; > > scm_init_guile (); > > > > scm_c_primitive_load ("scheme.scm"); > > > > s_symbol = scm_c_lookup("number"); > > s_value = scm_variable_ref(s_symbol); > > number = gh_scm2int(s_value, 0, "main"); > > } > > > > --- > > > > This convert the Scheme data in C data, but I do not know how to > pass > > a group of data together. ex.: How to convert a (cons x y) into a > > struct? > > Well, for example: > > (define number (cons 3 4)) > > instead of (define number 1), and then > > struct point number > SCM s_symbol, s_value; > scm_init_guile (); > > scm_c_primitive_load ("scheme.scm"); > > s_symbol = scm_c_lookup("number"); > s_value = scm_variable_ref(s_symbol); > number.x = gh_scm2int(SCM_CAR(s_value), 0, "main"); > number.y = gh_scm2int(SCM_CDR(s_value), 0, "main"); > > instead of the C code above. Does that make sense? > > A scheme list can be as long as you like, so can hold more than 2 > values, and each value can be a different type. So you can equally > well have 2 numbers and a string, for example. > > > > > I want to create a wrap to a function that has a sruct as arg, so, > I > > need to create that struct in scheme and convert it to C, how to do > > that? > > It depends what the C code expects as regards the lifetime of the > struct. If the struct only needs to be value for the duration of the > call to your C func, you can allocate it on the stack, initialize it > from a Scheme pair/list as shown above, and then call the C func. If > the struct needs to be longer lived than that, the SMOB approach is > probably best. > > Regards, > Neil > > > > _______________________________________________ > Guile-user mailing list > Guile-user@gnu.org > http://lists.gnu.org/mailman/listinfo/guile-user > __________________________________ Yahoo! for Good - Make a difference this year. http://brand.yahoo.com/cybergivingweek2005/ _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user