Node:Calling Scheme procedures from C,
Next:Mixing gh and scm APIs,
Previous:Memory allocation and garbage collection,
Up:GH
19.12 Calling Scheme procedures from C
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 R5RS. 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_UNDEFINED from C to signify the end of the list.
SCM gh_define (char *name, SCM val)
|
Function |
Corresponds to the Scheme (define name val) : it binds a value to
the given name (which is a C string). Returns the new object.
|
Pairs and lists
SCM gh_cons (SCM a, SCM b)
|
Function |
SCM gh_list (SCM l0, SCM l1, ... , SCM_UNDEFINED)
|
Function |
These correspond to the Scheme (cons a b) and (list l0 l1
...) procedures. Note that gh_list() is a C macro that invokes
scm_listify() .
|
SCM gh_car (SCM obj)
|
Function |
SCM gh_cdr (SCM obj)
|
Function |
...
|
SCM gh_c[ad][ad][ad][ad]r (SCM obj)
|
Function |
These correspond to the Scheme (caadar ls) procedures etc ...
|
SCM gh_set_car_x(SCM pair, SCM value)
|
Function |
Modifies the CAR of pair to be value. This is equivalent to
the Scheme procedure (set-car! ...) .
|
SCM gh_set_cdr_x(SCM pair, SCM value)
|
Function |
Modifies the CDR of pair to be value. This is equivalent to
the Scheme procedure (set-cdr! ...) .
|
unsigned long gh_length (SCM ls)
|
Function |
Returns the length of the list.
|
SCM gh_append (SCM args)
|
Function |
SCM gh_append2 (SCM l1, SCM l2)
|
Function |
SCM gh_append3 (SCM l1, SCM l2, l3)
|
Function |
SCM gh_append4 (SCM l1, SCM l2, l3, l4)
|
Function |
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 gh_reverse (SCM ls)
|
Function |
Returns a new list that has the same elements as ls but in the
reverse order. Note that this is implemented as a macro which calls
scm_reverse() .
|
SCM gh_list_tail (SCM ls, SCM k)
|
Function |
Returns the sublist of ls with the last k elements.
|
SCM gh_list_ref (SCM ls, SCM k)
|
Function |
Returns the kth element of the list ls.
|
SCM gh_memq (SCM x, SCM ls)
|
Function |
SCM gh_memv (SCM x, SCM ls)
|
Function |
SCM gh_member (SCM x, SCM ls)
|
Function |
These functions return the first sublist of ls whose CAR is
x. They correspond to (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.
|
SCM gh_assq (SCM x, SCM alist)
|
Function |
SCM gh_assv (SCM x, SCM alist)
|
Function |
SCM gh_assoc (SCM x, SCM alist)
|
Function |
These functions search an association list (list of pairs)
alist for the first pair whose CAR is x, and they return
that pair.
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.
|
Symbols
Vectors
SCM gh_make_vector (SCM n, SCM fill)
|
Function |
SCM gh_vector (SCM ls)
|
Function |
SCM gh_vector_ref (SCM v, SCM i)
|
Function |
SCM gh_vector_set (SCM v, SCM i, SCM val)
|
Function |
unsigned long gh_vector_length (SCM v)
|
Function |
SCM gh_list_to_vector (SCM ls)
|
Function |
These correspond to the Scheme (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
takes 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.
|
Procedures
SCM gh_apply (SCM proc, SCM args)
|
Function |
Call the Scheme procedure proc, with the elements of args as
arguments. args must be a proper list.
|
SCM gh_call0 (SCM proc)
|
Function |
SCM gh_call1 (SCM proc, SCM arg)
|
Function |
SCM gh_call2 (SCM proc, SCM arg1, SCM arg2)
|
Function |
SCM gh_call3 (SCM proc, SCM arg1, SCM arg2, SCM arg3)
|
Function |
Call the Scheme procedure proc with no arguments
(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.
|
SCM gh_catch (SCM key, SCM thunk, SCM handler)
|
Function |
SCM gh_throw (SCM key, SCM args)
|
Function |
Corresponds to the Scheme catch and throw procedures,
which in Guile are provided as primitives.
|
SCM gh_is_eq (SCM a, SCM b)
|
Function |
SCM gh_is_eqv (SCM a, SCM b)
|
Function |
SCM gh_is_equal (SCM a, SCM b)
|
Function |
These correspond to the Scheme eq? , eqv? and equal?
predicates.
|
int gh_obj_length (SCM obj)
|
Function |
Returns the raw object length.
|
Data lookup
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 name space 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] */