use type predicates in type-checking
Consider this snippet (derived from r7rs-tests.scm):
(let ((val "abc"))
(cond ((and (complex? val)
(not (nan? val)))
(display val))))
The nan?
predicate only allows numerical arguments. Right now (because of a demangling bug) Kawa does not complain, but if we fix the demangling bug then Kawa complains that val
(a string) is incompatible with the required type of nan?
(number). It does this even though the previous test (complex? val)
ensures that nan?
is never called.
Kawa needs logic to take predicates such as complex?
into consideration. In this case it should recognize that (complex? "abc")
is always false, and so it can simplify the cond
.
More generally, in (if (and (T1? x) (T2? x)) (A x) (B x))
Kawa should realize that x
has type T1
when testing T2?
, and that x
is both T1
and T2
in (A x)
.