[racket] Default arguments don't need to follow the contract?
This seems odd, but is useful:
(define/contract (foo #:opt1 [opt1 #f] #:opt2 [opt2 #f])
(->* () (#:opt1 real? #:opt2 real?) real?)
(or opt1 opt2 30))
The keyword arguments' default values aren't 'real?', but nothing
complains when 'foo' is applied.
It allows me to have 'foo' with an '#:opt1' keyword with contract
'real?', default 30, and an '#:opt2' keyword for backward-compatibility:
(foo) ; => 30
(foo #:opt1 45) ; => 45
(foo #:opt2 23) ; => 23
(foo #:opt1 45 #:opt2 23) ; => 45
Is it intentional? Will this behavior ever change?
Neil T