(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.mat...@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 <mik...@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.mat...@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