* passing flags to a function @ 2006-05-02 12:25 Dan McMahill 2006-05-02 15:34 ` Ludovic Courtès ` (2 more replies) 0 siblings, 3 replies; 8+ messages in thread From: Dan McMahill @ 2006-05-02 12:25 UTC (permalink / raw) Hello, I'm sure this is a very basic question about passing "or-able" flags to a function. In C I might do something like: #define FLAG_FOO 1 #define FLAG_BAR 2 #define FLAG_BAZ 4 .... myfn(int flags) { if (flags & FLAG_BAR) printf ("bar flag is set\n"); ... } and then call myfn with things like myfn(FLAG_FOO | FLAG_BAZ); now suppose I want to wrap up myfn and make it available from scheme. What is the normal scheme way for passing in flags to a function? I can do something like SCM scm_myfn(SCM flags) { myfn (scm_num2int (flags, SCM_ARG1, "myfn")); return SCM_BOOLEAN_T; } but I'm not sure of the best way to define the flags in scheme. Or maybe this is not "the scheme way". Thanks for any suggestions. -Dan _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: passing flags to a function 2006-05-02 12:25 passing flags to a function Dan McMahill @ 2006-05-02 15:34 ` Ludovic Courtès 2006-05-02 16:21 ` Dan McMahill 2006-05-02 16:14 ` Clinton Ebadi 2006-05-03 1:43 ` Kevin Ryde 2 siblings, 1 reply; 8+ messages in thread From: Ludovic Courtès @ 2006-05-02 15:34 UTC (permalink / raw) Cc: guile-user Hi, Dan McMahill <mcmahill@mtl.mit.edu> writes: > I can do something like > > SCM scm_myfn(SCM flags) > { > > myfn (scm_num2int (flags, SCM_ARG1, "myfn")); > > return SCM_BOOLEAN_T; > > } > > but I'm not sure of the best way to define the flags in scheme. Or > maybe this is not "the scheme way". What you describe above is doable and is an approach sometimes taken. See for instance the POSIX functions in Guile, e.g., `popen'. Personally, I prefer to pass a list of symbols rather than a single number in such situations. This might require some more work if you need to convert those flags to a C or'ed integer, but not so much because (i) symbols can be compared with `eq' which is fast, (ii) the list of flags may usually be small, and (iii) the number of values that can be taken by the flags is small as well. SCM_DEFINE (scm_func, "func", 0, 0, 1, (SCM flags), "My function takes any number of symbols.") #define FUNC_NAME "func" { int c_flags; for (c_flags = 0; scm_is_pair (flags); flags = SCM_CDR (flags)) { SCM f = SCM_CAR (flags); if (scm_is_eq (f, my_first_flag_sym)) c_flags |= MY_FIRST_FLAG; else if (scm_is_eq (f, my_second_flag_sym)) c_flags |= MY_SECOND_FLAG; else scm_wrong_type_arg (FUNC_NAME, 1, f); } /* ... */ } #undef FUNC_NAME But this is debatable and it also depends on the context. Thanks, Ludovic. _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: passing flags to a function 2006-05-02 15:34 ` Ludovic Courtès @ 2006-05-02 16:21 ` Dan McMahill 2006-05-02 16:55 ` Ludovic Courtès 2006-05-07 21:03 ` Marius Vollmer 0 siblings, 2 replies; 8+ messages in thread From: Dan McMahill @ 2006-05-02 16:21 UTC (permalink / raw) Cc: guile-user Ludovic Courtès wrote: > Hi, > > Dan McMahill <mcmahill@mtl.mit.edu> writes: > > >>I can do something like >> >>SCM scm_myfn(SCM flags) >>{ >> >> myfn (scm_num2int (flags, SCM_ARG1, "myfn")); >> >> return SCM_BOOLEAN_T; >> >>} >> >>but I'm not sure of the best way to define the flags in scheme. Or >>maybe this is not "the scheme way". > > > What you describe above is doable and is an approach sometimes taken. > See for instance the POSIX functions in Guile, e.g., `popen'. > > Personally, I prefer to pass a list of symbols rather than a single > number in such situations. This might require some more work if you > need to convert those flags to a C or'ed integer, but not so much > because (i) symbols can be compared with `eq' which is fast, (ii) > the list of flags may usually be small, and (iii) the number of values > that can be taken by the flags is small as well. > Hi Ludovic, Thanks for the reply. Could you show a short example of what the scheme function call might look like? Are you meaning (foo (list 'flag1 'flag2 'someotherflag)) I don't care much about speed in this particular case. Thanks -Dan _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: passing flags to a function 2006-05-02 16:21 ` Dan McMahill @ 2006-05-02 16:55 ` Ludovic Courtès 2006-05-02 16:56 ` Dan McMahill 2006-05-07 21:03 ` Marius Vollmer 1 sibling, 1 reply; 8+ messages in thread From: Ludovic Courtès @ 2006-05-02 16:55 UTC (permalink / raw) Cc: guile-user Hi, Dan McMahill <mcmahill@mtl.mit.edu> writes: > Thanks for the reply. Could you show a short example of what the > scheme function call might look like? > > Are you meaning > > (foo (list 'flag1 'flag2 'someotherflag)) Rather, it would look like: (foo 'flag1 'flag2 'someotherflag) This is because my example uses "rest" arguments, but you could also do the same as what you describe using a non-rest list argument. Thanks, Ludovic. _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: passing flags to a function 2006-05-02 16:55 ` Ludovic Courtès @ 2006-05-02 16:56 ` Dan McMahill 0 siblings, 0 replies; 8+ messages in thread From: Dan McMahill @ 2006-05-02 16:56 UTC (permalink / raw) Cc: guile-user Ludovic Courtès wrote: > Hi, > > Dan McMahill <mcmahill@mtl.mit.edu> writes: > > >>Thanks for the reply. Could you show a short example of what the >>scheme function call might look like? >> >>Are you meaning >> >>(foo (list 'flag1 'flag2 'someotherflag)) > > > Rather, it would look like: > > (foo 'flag1 'flag2 'someotherflag) > > This is because my example uses "rest" arguments, but you could also do > the same as what you describe using a non-rest list argument. > > Thanks, > Ludovic. > Thanks! I think this should be enough to get me pointed in the right direction. -Dan _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: passing flags to a function 2006-05-02 16:21 ` Dan McMahill 2006-05-02 16:55 ` Ludovic Courtès @ 2006-05-07 21:03 ` Marius Vollmer 1 sibling, 0 replies; 8+ messages in thread From: Marius Vollmer @ 2006-05-07 21:03 UTC (permalink / raw) Cc: guile-user Dan McMahill <mcmahill@mtl.mit.edu> writes: > Are you meaning > > (foo (list 'flag1 'flag2 'someotherflag)) To make this look nicer, you can also write (foo '(flag1 flag2 someotherflag)) Another option are keyword arguments, like (foo :flag1 #t :flag2 #t :someotherflag #t) There is no C-level support for parsing argument lists like this, unfortunately; you have to do it manually. -- GPG: D5D4E405 - 2F9B BCCC 8527 692A 04E3 331E FAF8 226A D5D4 E405 _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: passing flags to a function 2006-05-02 12:25 passing flags to a function Dan McMahill 2006-05-02 15:34 ` Ludovic Courtès @ 2006-05-02 16:14 ` Clinton Ebadi 2006-05-03 1:43 ` Kevin Ryde 2 siblings, 0 replies; 8+ messages in thread From: Clinton Ebadi @ 2006-05-02 16:14 UTC (permalink / raw) Cc: guile-user [-- Attachment #1.1: Type: text/plain, Size: 969 bytes --] On Tue, 2006-05-02 at 08:25 -0400, Dan McMahill wrote: > Hello, > > I'm sure this is a very basic question about passing "or-able" flags to > a function. In C I might do something like: ...snip... You can make the flags available to scheme as numbers, and then the Scheme users can use Guile's bitwise operations (logand, longior, logxor, etc. [see Simple Data Types -> Numbers -> Bitwise Operations in the manual]). > but I'm not sure of the best way to define the flags in scheme. Or > maybe this is not "the scheme way". This isn't really the Scheme way, but it works if you want to get bindings done quickly. Ludovic already recommended the more schemey way, but this isn't such a bad thing for an extension to a C program. -- http://unknownlamer.org AIM:unknownlamer IRC:unknown_lamer@fnode#tpu Jabber:clinton@hcoop.net I use Free Software because I value freedom over features. 443E 4F1A E213 7C54 A306 E328 7601 A1F0 F403 574B [-- Attachment #1.2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 189 bytes --] [-- Attachment #2: Type: text/plain, Size: 140 bytes --] _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: passing flags to a function 2006-05-02 12:25 passing flags to a function Dan McMahill 2006-05-02 15:34 ` Ludovic Courtès 2006-05-02 16:14 ` Clinton Ebadi @ 2006-05-03 1:43 ` Kevin Ryde 2 siblings, 0 replies; 8+ messages in thread From: Kevin Ryde @ 2006-05-03 1:43 UTC (permalink / raw) Cc: guile-user Dan McMahill <mcmahill@mtl.mit.edu> writes: > > SCM scm_myfn(SCM flags) > { > myfn (scm_num2int (flags, SCM_ARG1, "myfn")); Various things in the guile core are done like that, stuff like O_RDWR for `open'. The list of symbols Ludovic described is done in the guile-gtk interface and works nicely too. If you're entirely in scheme then the ice-9 optargs module to take keywords is good, especially if you want actual values, not just yes/no flags. (foo #:error-check #t #:verbose #f ...) _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2006-05-07 21:03 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-05-02 12:25 passing flags to a function Dan McMahill 2006-05-02 15:34 ` Ludovic Courtès 2006-05-02 16:21 ` Dan McMahill 2006-05-02 16:55 ` Ludovic Courtès 2006-05-02 16:56 ` Dan McMahill 2006-05-07 21:03 ` Marius Vollmer 2006-05-02 16:14 ` Clinton Ebadi 2006-05-03 1:43 ` Kevin Ryde
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).