> On Feb 20, 2019, at 8:47 AM, Kees-Jochem Wehrmeijer <henc...@gmail.com> wrote:
> 
> While this scheme works, it silently breaks if a user accidentally calls 
> (yield) instead of ((yield)). It might not be a big deal, but in an ideal 
> world I'd only allow the 'correct' way.


You can make a new `define` form where `yield` means something different:


#lang racket
(require (except-in racket/generator yield)
         (prefix-in gen: (only-in racket/generator yield))
         racket/stxparam)

(define-syntax-parameter yield (λ (stx) #'"error: `yield` not parameterized"))

(define-syntax (yield* stx)
  (syntax-case stx ()
    [(_ . vals)
     #'(call-with-values (thunk (gen:yield . vals))
                         (case-lambda
                           [() (void)]
                           [(v) (if (exn? v)
                                    (raise v)
                                    v)]
                           [vs vs]))]))

(define-syntax (define/ideal-world stx)
  (syntax-case stx ()
    [(_ ID . BODY)
     #'(define ID
         (syntax-parameterize ([yield (make-rename-transformer #'yield*)])
           . BODY))]))

(define/ideal-world mygenerator (generator ()
                                           (with-handlers ([exn? (lambda (e) 
(yield 42))])
                                             (yield 1)
                                             (yield 2)
                                             (yield 3))))
(mygenerator)

(mygenerator (exn:fail "Welp" (current-continuation-marks)))

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to