Hello Mark, Oh, I didn't really think too much about this. I always thought immediate objects like SCM_EOL, SCM_BOOL_T, ..., SCM_UNDEFINED can be compared using '=='. Is this an implementation detail that I should not depend on? Mark H Weaver writes: > Hi Alex, > > Alex Vong writes: > >> From the Guile manual ``6.1 Overview of the Guile API'', >> >>> For some Scheme functions, some last arguments are optional; the >>> corresponding C function must always be invoked with all optional >>> arguments specified. To get the effect as if an argument has not been >>> specified, pass ‘SCM_UNDEFINED’ as its value. You can not do this for >>> an argument in the middle; when one argument is ‘SCM_UNDEFINED’ all the >>> ones following it must be ‘SCM_UNDEFINED’ as well. >> >> Therefore, we can check if opt_arg2 has the value SCM_UNDEFINED, to >> decide if we have received an optional argument. > > Yes indeed, and your attached code is *almost* correct, except for one > serious problem: > >> #include >> >> static SCM myfun(SCM arg1,SCM opt_arg2) >> { >> if (opt_arg2 == SCM_UNDEFINED) > > You must not use '==' to compare values of type SCM. Instead, use > 'scm_is_eq', like this: > > if (scm_is_eq (opt_arg2, SCM_UNDEFINED)) > > Guile explicitly makes no promises about the SCM type, so there's no > guarantee that '==' will do the right thing. SCM is to be treated as an > abstract type. Look up 'SCM' in the Guile manual's index. Section 6.3 > (The SCM Type) of the manual states: > > -- C Type: SCM > ‘SCM’ is the user level abstract C type that is used to represent > all of Guile’s Scheme objects, no matter what the Scheme object > type is. No C operation except assignment is guaranteed to work > with variables of type ‘SCM’, so you should only use macros and > functions to work with ‘SCM’ values. [...] > > Here's the Guile manual entry for 'scm_is_eq', which also mentions that > you must not use '==': > > -- C Function: int scm_is_eq (SCM x, SCM y) > Return ‘1’ when X and Y are equal in the sense of ‘eq?’, otherwise > return ‘0’. > > The ‘==’ operator should not be used on ‘SCM’ values, an ‘SCM’ is a > C type which cannot necessarily be compared using ‘==’ (*note The > SCM Type::). > > Other than that, the attached code looks good to me. > > Mark