From: Paul K. <pv...@pv...> - 2013-07-29 13:13:51
|
Jan Moringen wrote: > a few days ago, I started looking into bug 327537 [1] under the > (much appreciated) guidance of pkhuong. With the implementation > technique suggested by pkhuong, a sketch for compile time > checks/optimizations of PROPER-LIST-OF-LENGTH-P as suggested in the > bug report was relatively straight forward. [...] > The carefully designed part is that #:WHOLE13940 is only used once: > in the check-proper-list-of-length call. This fact can be exploited > by a deftransform for check-proper-list-of-length to conclude that > WHOLE13940 is not mutated and that its derived type can be trusted. I recently had a sad insight into this: what does it mean when a function like (lambda () (let ((x (list 1 2 3))) (values x x))) is of type (function * (values (cons integer (cons integer (cons integer null))) cons &optional))? Our current machinery, with lvar-conservative-type (used in CAR and CDR derive-type and to determine array dimensions), already seems wrong here. Is such aliasing disallowed by the type system? Paul Khuong |