GNU Info

Info Node: (guile-tut.info)How to get started with libguile

(guile-tut.info)How to get started with libguile


Next: More interesting programming with libguile Prev: What is libguile Up: Guile in a Library
Enter node , (file) or (file)node

How to get started with libguile
================================

  Here is an elementary first program, `learn0', to get going with
libguile.  The program (which uses Scheme as a master world) is in a
single source file, `learn0.c':

     /* test the new libgh.a (Guile High-level library) with a trivial
        program */
     
     #include <stdio.h>
     
     #include <guile/gh.h>
     
     void main_prog(int argc, char *argv[]);
     
     main(int argc, char *argv[])
     {
       gh_enter(argc, argv, main_prog);
     }
     
     void main_prog(int argc, char *argv[])
     {
       int done;
       char input_str[200];
     
       gh_eval_str("(display \"hello Guile\")");
       gh_eval_str("(newline)");
     
       /* for fun, evaluate some simple Scheme expressions here */
       gh_eval_str("(define (square x) (* x x))");
       gh_eval_str("(define (fact n) (if (= n 1) 1 (* n (fact (- n 1)))))");
       gh_eval_str("(square 9)");
     
       /* now sit in a Scheme eval loop: I input the expressions, have
          Guile evaluate them, and then get another expression. */
       done = 0;
       fputs("learn0> ", stdout);
       while (fgets(input_str, 199, stdin) != NULL) {
         gh_eval_str(input_str);
         fputs("\nlearn0> ", stdout);
       }
     
       exit(0);
     }

  If you name this program `learn0.c', it can now be compiled with:
     gcc -g -c learn0.c -o learn0.o
     gcc -o learn0 learn0.o -lguile -lm

  The program is simple: it creates a Scheme interpreter, passes a
couple of strings to it that define new Scheme functions `square' and
`factorial', and then a couple of strings that invoke those functions.

  It then goes into a read-eval-print-loop (REPL), so you could type
one-line Scheme expressions to it and have them evaluated.  For example:
     <shell-prompt> ./learn0
     hello Guile
     learn0> (display (sin 1.3))
     963.558185417193e-3
     learn0> (display (fact 10))
     3628800
     learn0> (quit)
     <shell-prompt>

  You should notice the key steps involved in this `learn0' program:

  1. `#include <guile/gh.h>'

  2. You need to invoke the initialization routine `gh_enter()'.  This
     starts up a Scheme interpreter, handling many
     implementation-specific details.

  3. Your main() function should be almost empty: the real main program
     goes in a separate function main_prog() which is passed to
     gh_enter().  This rather arcane convention is due to the way
     Guile's garbage collector works: the whole program has to run in
     the dynamic context of `gh_enter()'.

  4. You pass strings to the Scheme interpreter with the `gh_eval_str()'
     routine.

  5. You link your program with `-lguile'.


automatically generated by info2www version 1.2.2.9