i need a way to escape not only the current call of a recursive function (it is already done) but alls:
example: (def (foo n) (cond ((= n 0) 'end0) ((= n 7) (return 'end7)) (else (cons n (foo {n - 1}))))) cheme@(guile-user)> (foo 5) (5 4 3 2 1 . end0) scheme@(guile-user)> (foo 10) (10 9 8 . end7) it has just escaped from the current call to foo (def (bar n) (cond ((= n 0) 'end0) ((= n 7) (return-rec 'end7)) (else (cons n (bar {n - 1}))))) scheme@(guile-user)> (bar 5) (5 4 3 2 1 . end0) scheme@(guile-user)> (bar 10) ice-9/boot-9.scm:1669:16: In procedure raise-exception: Unbound variable: return-rec i admit i should read the K. Dybvig macro paper but still had not completely do it. i modify this code of my Scheme+ but it fails on (bar 10) : (define-syntax def (lambda (stx) (syntax-case stx () ;; multiple definitions without values assigned ;; (def (x y z)) ((_ (var1 ...)) #`(begin (define var1 '()) ...)) ;; (def (foo) (when #t (return "hello") "bye")) ;; ((_ (<name> <arg> ...) <body> <body>* ...) ;; (let ((ret-id (datum->syntax stx 'return))) ;; #`(define (<name> <arg> ...) ;; (call/cc (lambda (#,ret-id) <body> <body>* ...))))) ((_ (<name> <arg> ...) <body> <body>* ...) (let ((ret-id (datum->syntax stx 'return)) (ret-rec-id (datum->syntax stx 'return-rec))) #`(define (<name> <arg> ...) (define (<name> <arg> ...) (call/cc (lambda (#,ret-id) <body> <body>* ...))) (call/cc (lambda (#,ret-rec-id) (<name> <arg> ...)))))) ;; single definition without a value assigned ;; (def x) ((_ var) #`(define var '())) ;; (def x 7) ((_ var expr) #`(define var expr)) ((_ err ...) #`(syntax-error "Bad def form")) ))) i'am even surprised it works on (bar 5) if someone had a solution to this problem i will again copy/paste it in my code and gracefully thanks him a lot :-) best regards, damien