cross-module `error` changed?

24 views
Skip to first unread message

Shriram Krishnamurthi

unread,
Nov 6, 2020, 8:29:51 AM11/6/20
to Racket Users
Has something changed in how `error` works across modules? This code that I used last year without trouble seems to run into trouble now.

Here's the code all in one module:

#lang racket

(provide yield resume)

(define resumer #f)

(define (yield)
  (let/cc k
    (set! resumer k)
    (error 'yield "yielding computation")))

(define (resume)
  (resumer 'dummy))

(define (fact n)
  (if (= n 0)
      1
      (begin
        (when (= (remainder n 10) 0)
          (yield))
        (* n (fact (- n 1))))))

It results in the following (desired) interaction:

> (fact 10)
. . yield: yielding computation
> (resume)
3628800

But now I'm going to remove the definition of `fact` and put it in another module, saving the remainder as `yielder.rkt`:

#lang racket

(require "yielder.rkt")

(define (fact n)
  (if (= n 0)
      1
      (begin
        (when (= (remainder n 10) 0)
          (yield))
        (* n (fact (- n 1))))))

Now I get the following error. What should I be doing instead?

> (fact 10)
-- #(struct:exn:fail:contract "vector-ref: contract violation\n  expected: vector?\n  given: '((error 'yield \"yielding computation\") #<path:/Users/sk/Desktop/yielder.rkt> 10 4 113 37)\n  argument position: 1st\n  other arguments...:\n   0" #<continuation-mark-set>)
  (errortrace-stack-item->srcloc . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/drracket/drracket/private/stack-checkpoint.rkt> 168 0 6297 203))
  (pick-first-defs . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/drracket/drracket/private/stack-checkpoint.rkt> 331 0 13000 425))
  (get-exn-source-locs . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/drracket/drracket/private/stack-checkpoint.rkt> 585 0 23184 391))
  (#f . #(struct:srcloc #<path:/Applications/Racket v7.8/collects/racket/contract/private/arrow-val-first.rkt> 486 18 20735 32))
  (error-display-handler/stacktrace . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/drracket/drracket/private/debug.rkt> 362 2 15076 2612))
  (call-with-exception-handler . #(struct:srcloc #<path:/Applications/Racket v7.8/collects/racket/private/more-scheme.rkt> 266 2 9251 256))
  (fact . #(struct:srcloc #<path:/Users/sk/Desktop/client.rkt> 5 0 40 139))
  (eval-one-top . #f)
  (call-with-exception-handler . #(struct:srcloc #<path:/Applications/Racket v7.8/collects/racket/private/more-scheme.rkt> 266 2 9251 256))
  (loop . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/drracket/drracket/private/rep.rkt> 1210 24 50804 979))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket v7.8/collects/racket/private/more-scheme.rkt> 148 2 4909 517))
  (#f . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/drracket/drracket/private/rep.rkt> 1180 9 49153 5062))
  (#f . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/drracket/drracket/private/rep.rkt> 1493 15 64385 1548))
  (#f . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 435 6 19067 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 486 32 21054 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket v7.8/collects/racket/private/more-scheme.rkt> 148 2 4909 517))
  (eventspace-handler-thread-proc . #(struct:srcloc #<path:/Applications/Racket v7.8/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 370 11 16515 690))
exception raised by error display handler: vector-ref: contract violation
  expected: vector?
  given: '((error 'yield "yielding computation") #<path:/Users/sk/Desktop/yielder.rkt> 10 4 113 37)
  argument position: 1st
  other arguments...:
   0; original exception raised: yield: yielding computation

Sorawee Porncharoenwase

unread,
Nov 6, 2020, 8:48:14 AM11/6/20
to Shriram Krishnamurthi, Racket Users
This is the same problem as https://github.com/racket/racket/issues/3355. It's already been fixed in Racket 7.9.

--
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...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/6aa1ad8a-9f1a-4c11-8b75-5ed3ca09797dn%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages