guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: call/cc does not return a value


From: Mikael Djurfeldt
Subject: Re: call/cc does not return a value
Date: Fri, 13 Sep 2024 11:29:58 +0200

(Well, I thought the main reason why it didn't return a value was
(escape) in the old code, i.e., the continuation is called without
arguments.)

On Fri, Sep 13, 2024 at 11:16 AM Damien Mattei <damien.mattei@gmail.com> wrote:
>
> hello Mikael,
>
> you remark help because ,even if 'let' and 'let-syntax' seems interchangeable 
> here, there was indeed a problem with syntax....
> i did not write myself the macro originally and when comparing with def.scm 
> that allow returning value from a function there was a difference, there was 
> no use of kwd and stx should be used in place of it and even more it should 
> be simply stx and not (syntax kwd) or (syntax stx) in the macro definition, 
> here is the final version of code:
>
>
> (define-syntax for
>
>   (lambda (stx)
>
>     (syntax-case stx ()
>
>       ((_ (init test incrmt) body ...)
>
>        (with-syntax ((BREAK (datum->syntax stx 'break))
>                      (CONTINUE (datum->syntax stx 'continue)))
>      (syntax
>       (call/cc
>        (lambda (escape)
>          (let ((BREAK escape))
>            init
>            (let loop ()
>          (when test
>            (call/cc
>             (lambda (next)
>               (let ((CONTINUE next))
>             (let () ;; allow definitions
>               body ...)))) ; end call/cc
>            incrmt
>            (loop))) ; end let loop
>            ))))) ;; close with-syntax
>        ))))
>
> and the good result now with Guile and Racket (not yet modified Kawa):
>
> scheme@(guile-user)> (for ((define i 0) (< i 5) (set! i (+ i 1))) (define x 
> 7) (display i)  (newline) (when (= i 2) (break "finish")))
> 0
> 1
> 2
> $1 = "finish"
>
> thank for you help , without you i would not have look so closely to this 
> macro written many years ago and used in the Guile,Racket and Kawa version of 
> Scheme+...
>
> Damien
>
> On Fri, Sep 13, 2024 at 10:25 AM Mikael Djurfeldt <mikael@djurfeldt.com> 
> wrote:
>>
>> Hi Damien,
>>
>> Maybe I'm missing something, but shoudn't it be:
>>
>> (define-syntax for
>>   (lambda (stx)
>>     (syntax-case stx ()
>>       ((kwd (init test incrmt) body ...)
>>        (with-syntax ((BREAK (datum->syntax (syntax kwd) 'break))
>>                      (CONTINUE (datum->syntax (syntax kwd) 'continue)))
>>      (syntax
>>       (call/cc
>>        (lambda (escape)
>>          (let ((BREAK escape))
>>            init
>>            (let loop ()
>>          (when test
>>            (call/cc
>>             (lambda (next)
>>               (let ((CONTINUE next))
>>             (let () ;; allow definitions
>>               body ...)))) ; end call/cc
>>            incrmt
>>            (loop))) ; end let loop
>>            ))))) ;; close with-syntax
>>        ))))
>>
>> ?
>>
>> On Fri, Sep 13, 2024 at 8:53 AM Damien Mattei <damien.mattei@gmail.com> 
>> wrote:
>> >
>> > hello,
>> >
>> > i believed call/cc allowed to return value but i have this macro and i can
>> > use continuation, but the value is not passed to the continuation:
>> >
>> > (define-syntax for
>> >    (lambda (stx)
>> >      (syntax-case stx ()
>> >        ((kwd (init test incrmt) body ...)
>> >
>> >         (with-syntax ((BREAK (datum->syntax (syntax kwd) 'break))
>> >                       (CONTINUE (datum->syntax (syntax kwd) 'continue)))
>> >
>> >     (syntax
>> >      (call/cc
>> >       (lambda (escape)
>> > (let-syntax ((BREAK (identifier-syntax (escape))))
>> >   init
>> >   (let loop ()
>> >     (when test
>> >       (call/cc
>> > (lambda (next)
>> >  (let-syntax ((CONTINUE (identifier-syntax (next))))
>> >    (let () ;; allow definitions
>> >      body ...)))) ; end call/cc
>> >       incrmt
>> >       (loop))) ; end let loop
>> >   ))))) ;; close with-syntax
>> > ))))
>> >
>> >
>> > mattei@acer:~$ guile
>> > GNU Guile 3.0.9
>> > Copyright (C) 1995-2023 Free Software Foundation, Inc.
>> >
>> > Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
>> > This program is free software, and you are welcome to redistribute it
>> > under certain conditions; type `,show c' for details.
>> >
>> > Enter `,help' for help.
>> > scheme@(guile-user)> (use-modules (Scheme+))
>> > WARNING: (Scheme+): imported module (if-then-else) overrides core binding
>> > `if'
>> > WARNING: (Scheme+): imported module (when-unless) overrides core binding
>> > `when'
>> > WARNING: (Scheme+): imported module (when-unless) overrides core binding
>> > `unless'
>> >
>> > scheme@(guile-user)> (for ((define i 0) (< i 5) (set! i (+ i 1))) (define x
>> > 7) (display i)  (newline) (when (= i 2) (break "finish")))
>> > 0
>> > 1
>> > 2
>> >
>> > here i should get "finish" at REPL but nothing happens?
>> >
>> > regards



reply via email to

[Prev in Thread] Current Thread [Next in Thread]