typed-racket icon indicating copy to clipboard operation
typed-racket copied to clipboard

A strange bug caused by `provide` and recursive `MListof`.

Open NoahStoryM opened this issue 3 years ago • 1 comments

What version of Racket are you using?

v8.2

What program did you run?

#lang typed/racket/base

(provide func-1 func-2)

(define-type MNulls (MListof MNulls))

(: func-1 [-> MNulls Any]) (define (func-1 ns) 1)
(: func-2 [-> MNulls Any]) (define (func-2 ns) 2)

(displayln (func-1 '()))
(displayln (func-2 '()))

What should have happened?

print:

1
2

And if I defined MNulls as (define-type MNulls (Listof MNulls)) or (define-type MNulls (MListof Null)), or didn’t provide both functions, it'll work well.

If you got an error message, please include it here.

car: contract violation
  expected: pair?
  given: #f
  context...:
   .../private/map.rkt:40:19: loop
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/combinators/function.rkt:127:0: function-sc-map
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/combinators/function.rkt:33:11: sc-traverse
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/instantiate.rkt:80:0: compute-defs
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/instantiate.rkt:109:0: compute-constraints
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/instantiate.rkt:45:4
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/instantiate.rkt:43:0: instantiate/optimize
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/private/type-contract.rkt:148:0: generate-contract-def/provide
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/private/type-contract.rkt:238:0: change-provide-fixups
   .../private/runtime.rkt:80:24: temp275
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/private/type-contract.rkt:238:0: change-provide-fixups
   [repeats 1 more time]
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/core.rkt:44:10
   /usr/share/racket/pkgs/typed-racket-lib/typed-racket/typed-racket.rkt:22:4

NoahStoryM avatar Nov 04 '21 07:11 NoahStoryM

It seems that we can use unit to circumvent this bug:

#lang typed/racket/base

(require typed/racket/unit)

(provide func-1 func-2)

(define-type MNulls (MListof MNulls))

(define-signature funcs^
  ([func-1 : [-> MNulls Any]]
   [func-2 : [-> MNulls Any]]))

(define-unit funcs@
  (import)
  (export funcs^)

  (define (func-1 ns) 1)
  (define (func-2 ns) 2))

(define-values/invoke-unit funcs@
  (import)
  (export funcs^))

(displayln (func-1 '()))
(displayln (func-2 '()))

NoahStoryM avatar Nov 05 '21 08:11 NoahStoryM