This is the mail archive of the guile@cygnus.com mailing list for the guile project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Problem with continuations



I was almost going to send this to bug-guile, but I am not sure it is
entirely a bug, and perhaps what I really want is another way to do
what I'm thinking. I'd like to use continuations to jump back and
forth between Scheme and C code, with the Scheme code preferably being
evaluated from a string inside the C code. The problem is that this
explodes, because scm_eval_string, which is what ultimately gets
called to deal with evaluating a string file, closes the port it
internally creates when it exits, and can't deal if it is re-entered
via a continuation. A simple example program will show what I mean:

---- begin cont-test.c ---
#include <guile/gh.h>

void g_main(int argc, char **argv);

int main(int argc, char **argv) {
  gh_enter(argc,argv,g_main);

}


void g_main(int argc, char **argv) {
  SCM x;
  x = gh_eval_str("(call-with-current-continuation (lambda (cont)"
		  "(lambda ()"
		  "(display 37)"
		  "(newline)"
		  "(cont cont))))");
  gh_display(x);
  gh_newline();
  gh_call0(x);
}
---- end cont-test.c ----

The output I get is something like this: 

#<procedure ()>
37
guile: Wrong type argument in position 1: #<closed: string 0>

having read the definition of scm_eval_string I am pretty sure that
what is happening is that scm_eval_string is getting re-entered and is
choking on the port that it closed. If people consider this a bug, the
only solution I can see is to use something like dynamic-wind from the
C side, the way call-with-input-port and such use it on the Scheme
side -- tricky to say the least. What I would really like is a
workaround that will allow me to get a similar effect. primitive-load
will not be any more helpful than eval-string; it suffers from the
same problem of closing its port the first time it returns. Can anyone
suggest what I can do?

 - Maciej Stachowiak