24 lines
728 B
Racket
24 lines
728 B
Racket
#lang typed/racket
|
|
|
|
;; make sure letrec takes into account that some bindings may be undefined
|
|
|
|
(letrec: ([x : Number 3])
|
|
x)
|
|
(letrec: ([x : Number 3]
|
|
[y : (-> Number) (lambda () x)]) ; lambdas are safe
|
|
y)
|
|
(letrec: ([a : (-> Void) (lambda () (b))]
|
|
[b : (-> Void) (lambda () (a))])
|
|
a)
|
|
(letrec: ([x : (Number -> Number) (lambda (y) (+ y 3))]
|
|
[y : Number (x 4)])
|
|
y)
|
|
(letrec-values: ([([a : (-> Number)]) (lambda () 3)]
|
|
[([b : (-> Number)]) (lambda () (a))]
|
|
[([x : Number] [y : Number]) (values (b) (b))])
|
|
x)
|
|
(letrec: ([x : Number 3]
|
|
[y : (Number -> Number) (lambda (x) (if z 0 1))] ; not transitively safe, but safe
|
|
[z : Number x])
|
|
z)
|