[Ecls-list] Embedding ECL interpreter in a C++ application
Michael O'Connor
moconnor59 at yahoo.com
Fri Mar 5 09:59:06 UTC 2004
Thanks for that - works nicely.
I have a follow-up question: is there a way of
determining if the parsing of the lisp code works ok?
Ideally I'd like to be able to call a function to tell
me if the interpreted lisp code contains errors and,
if so, what those errors are (but I'd like the
application to capture this information, without
requiring user interaction).
I was guessing cl_safe_eval() supports this, but I
couldn't figure out how to make it do so.
Thanks,
Michael
--- worm <worm at arrakis.es> wrote:
> Remitente: Michael O'Connor <moconnor59 at yahoo.com>
> Fecha: Miércoles, Marzo 3, 2004 6:30 pm
>
> > I was directed to an application called xchatlisp
> > which does a similar thing to what I'm trying to
> do.
> > From that I can see that I need to call cl_boot()
> to
> > initialise the ECL interpreter, and cl_load() to
> get
> > it to read / compile / run a lisp file.
> >
> > However I need to be able to split the read /
> compile
> > stages from the run stage (because the app is
> required
> > to run the same lisp program repeatedly on
> different
> > data sets, and I want to avoid the overhead of
> reading
> > / compiling the file on each run). I'm unable to
> > figure out what function calls are needed to
> perform
> > these tasks separately, any pointers would be much
> > appreciated.
>
> Just use any Common Lisp function you want. They are
> all
> available to the C programmer. For instance, the
> following
> is a dummy top level that is used to bootstrap ECL
>
> static cl_object si_simple_toplevel ()
> {
> cl_object sentence;
> int i;
>
> /* Simple minded top level loop */
> printf(";*** Lisp core booted ****\nECLS
> (Embeddable Common Lisp) %d
> pages\n", MAXPAGE);
> fflush(stdout);
> for (i = 1; i<fix(si_argc()); i++) {
> cl_object arg = si_argv(MAKE_FIXNUM(i));
> cl_load(1, arg);
> }
> while (1) {
> printf("\n> ");
> sentence = cl_read(3, Cnil, Cnil, OBJNULL);
> if (sentence == OBJNULL)
> return0();
> prin1(si_safe_eval(1, sentence), Cnil);
> }
> }
>
> As you see, there exists a C function cl_read()
> which implements
> the functionality of the READ function of common
> lisp. There
> exists also a function si_safe_eval() which
> implements EVAL
> and captures most errors. These two functions are
> exported to
> the lisp world, and take a variable number of
> arguments. Then the
> function prin1() is a simplified version of
> cl_prin1() (which also
> exists) and which implements the functionality of
> PRIN1... And so
> on and so forth.
>
> For more details about how to construct lisp forms
> other than using
> cl_read(), have a look at the developers guide.
>
> Juanjo
>
>
__________________________________
Do you Yahoo!?
Yahoo! Search - Find what youre looking for faster
http://search.yahoo.com
More information about the ecl-devel
mailing list