Many of the Scheme primitives are available in the gh_
interface; they take and return objects of type SCM, and one could
basically use them to write C code that mimics Scheme code.
I will list these routines here without much explanation, since what
they do is the same as documented in section `Standard Procedures' in R4RS. But I will point out that when a procedure takes a
variable number of arguments (such as gh_list
), you should pass
the constant SCM_EOL from C to signify the end of the list.
(define name val)
: it binds a value to
the given name (which is a C string). Returns the new object.
(cons a b)
and (list l0 l1
...)
procedures. Note that gh_list()
is a C macro that invokes
scm_listify()
.
(set-car! ...)
and (set-cdr!
...)
procedures.
(caadar ls)
procedures etc ...
(set-car! ...)
.
(set-cdr! ...)
.
gh_append()
takes args, which is a list of lists
(list1 list2 ...)
, and returns a list containing all the elements
of the individual lists.
A typical invocation of gh_append()
to append 5 lists together
would be
gh_append(gh_list(l1, l2, l3, l4, l5, SCM_UNDEFINED));
The functions gh_append2()
, gh_append2()
,
gh_append3()
and gh_append4()
are convenience routines to
make it easier for C programs to form the list of lists that goes as an
argument to gh_append()
.
scm_reverse()
.
(memq x ls)
, (memv x ls)
and
(member x ls)
, and hence use (respectively) eq?
,
eqv?
and equal?
to do comparisons.
If x does not appear in ls, the value SCM_BOOL_F
(not
the empty list) is returned.
Note that these functions are implemented as macros which call
scm_memq()
, scm_memv()
and scm_member()
respectively.
If no pair in alist has x as its CAR, the value
SCM_BOOL_F
(not the empty list) is returned.
Note that these functions are implemented as macros which call
scm_assq()
, scm_assv()
and scm_assoc()
respectively.
(make-vector n fill)
,
(vector a b c ...)
(vector-ref v i)
(vector-set v i
value)
(vector-length v)
(list->vector ls)
procedures.
The correspondence is not perfect for gh_vector
: this routine
taks a list ls instead of the individual list elements, thus
making it identical to gh_list_to_vector
.
There is also a difference in gh_vector_length: the value returned is a
C unsigned long
instead of an SCM object.
gh_call0
), one argument (gh_call1
), and so on. You can
get the same effect by wrapping the arguments up into a list, and
calling gh_apply
; Guile provides these functions for convenience.
catch
and throw
procedures,
which in Guile are provided as primitives.
eq?
, eqv?
and equal?
predicates.
For now I just include Tim Pierce's comments from the `gh_data.c' file; it should be organized into a documentation of the two functions here.
/* Data lookups between C and Scheme Look up a symbol with a given name, and return the object to which it is bound. gh_lookup examines the Guile top level, and gh_module_lookup checks the module namespace specified by the `vec' argument. The return value is the Scheme object to which SNAME is bound, or SCM_UNDEFINED if SNAME is not bound in the given context. [FIXME: should this be SCM_UNSPECIFIED? Can a symbol ever legitimately be bound to SCM_UNDEFINED or SCM_UNSPECIFIED? What is the difference? -twp] */
Go to the first, previous, next, last section, table of contents.