This is the mail archive of the guile@cygnus.com mailing list for the guile project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
James Dean Palmer wrote: > > In the project I am working on, I am wanting to use optional > arguments like: > > (foo bar #:x 100 #:y 200) > > where foo is a c procedure. I thought the easiest way to handle this > would be to make foo a procedure with one required argument, bar, and > one rest argument, and then to parse the rest list for value pairs. > But I guess I don't know how to do this -- What are #:x and #:y in c? > I can't do a SCM_CHARS() to find out what they are (and yet, I can > gh_display() them) > > Any help or advice appreciated, > You can do a SCM_ROCHARS on them I think, or you can store objects representing the keywords by using something like { SCM key_x; key_x = scm_dash_symbol_to_keyword("-x"); scm_permanent_object(key_x); } at initialization time and then later compare to these using `gh_eq_p' or even just `='. The latter approach is probably better as it will be much faster than string comparison. Another approach you could consider is to declare a C primitive taking the ordinary sort of optional arguments, or fixed aruments, and use `define*' or `lambda*' from the `(ice-9 optargs)' module to write a wrapper around it in Scheme, as those provide a convenient way to declare procedures with keyword arguments, for example: (define* (scheme-foo bar #&key (x #f) (y #f)) (c-foo bar x y)) Keyword arguments may be supported directly in the interpreter at some point, in which case it may be easier to use them from C, but for now I would reccomend the Scheme-level wrapper approach. - Maciej