[racket] Continuation in embedding Racket

From: Nesterov Kirill (k.v.nesterov at yandex.ru)
Date: Thu Dec 4 05:01:48 EST 2014

Little clarification. I call (call-with-continuation-prompt (lambda () (generate-digit) (generate-digit))) and it's successfully executed, but if I try (call-with-continuation-prompt (lambda () (generate-digit)) two times - access violation occurs.

03.12.2014, 23:55, "Matthew Flatt" <mflatt at cs.utah.edu>:
> I don't think CGC versus 3m is relevant.
>
> My guess is that you need to wrap a prompt around each evaluation of a
> top-level form. You can try this manually at first: Does it work to
> change each `(generate-digit)` at the end below to
>
>  (call-with-continuation-prompt (lambda () (generate-digit)))
>
> ? If so, then building that `call-with-continuation-prompt` wrapper
> into your evaluation function will likely solve the problem.
>
> At Wed, 03 Dec 2014 23:45:28 +0300, Nesterov Kirill wrote:
>>  Hi all,
>>
>>  I'm trying to embed racket 3m version as interpreter into GUI application. For
>>  custom interpreters this application have two required APIs - first one is init
>>  and the second one is eval string. So in init I'm calling
>>  scheme_register_tls_space and scheme_main_setup after. And in eval I'm using
>>  custom version of Racket's read-eval-print-loop without recursion for
>>  evaluation of thrings. And everything is working well until I've tried to
>>  implement generator. Some reading of sources lead we into problem of
>>  continuation. This simple code leads to error "continuation application:
>>  attempt to cross a continuation barrier".
>>
>>  (define (generate-one-element-at-a-time lst)
>>
>>    (define (control-state return)
>>      (for-each
>>       (lambda (element)
>>                 (set! return (call-with-current-continuation
>>                                (lambda (resume-here)
>>                                  ;; Grab the current continuation
>>                                 (set! control-state resume-here)
>>                                 (return element)))))
>>       lst)
>>      (return 'you-fell-off-the-end))
>>
>>    (define (generator)
>>      (call-with-current-continuation control-state))
>>
>>    ;; Return the generator
>>    generator)
>>
>>  (define generate-digit
>>    (generate-one-element-at-a-time '(0 1 2)))
>>
>>  (generate-digit) ;; 0
>>  (generate-digit) ;; 1 ;; error "continuation application: attempt to cross a
>>  continuation barrier"
>>
>>  Attemt to use generators library lead to memory access violation. I suppose the
>>  problem lies in stack frames which are cleared every time eval callback from
>>  the main program is called. For some reasons I can't run racket in another
>>  thread. So may be there is an option how this problem could be solved? May be
>>  my assumption is not right? May be switch to CGC and mapping stack with
>>  scheme_set_stack_base into heap can help? If it help I can show the source of
>>  this plugin.
>>
>>  Thanks,
>>  Kirill
>>  ____________________
>>    Racket Users list:
>>    http://lists.racket-lang.org/users

Posted on the users mailing list.