: <value-info> ( -- info ) \ value-info new ;
+: read-only-slots ( values class -- slots )
+ #! Delegation.
+ all-slots rest-slice
+ [ read-only>> [ drop f ] unless ] 2map
+ { f f } prepend ;
+
+DEFER: <literal-info>
+
+: init-literal-info ( info -- info )
+ #! Delegation.
+ dup literal>> class >>class
+ dup literal>> dup real? [ [a,a] >>interval ] [
+ [ [-inf,inf] >>interval ] dip
+ {
+ { [ dup complex? ] [
+ [ real-part <literal-info> ]
+ [ imaginary-part <literal-info> ] bi
+ 2array >>slots
+ ] }
+ { [ dup tuple? ] [
+ [
+ tuple-slots rest-slice
+ [ <literal-info> ] map
+ ] [ class ] bi read-only-slots >>slots
+ ] }
+ [ drop ]
+ } cond
+ ] if ; inline
+
: init-value-info ( info -- info )
dup literal?>> [
- dup literal>> class >>class
- dup literal>> dup real? [ [a,a] ] [ drop [-inf,inf] ] if >>interval
+ init-literal-info
] [
dup [ class>> null-class? ] [ interval>> empty-interval eq? ] bi or [
null >>class
dup [ class>> ] [ interval>> ] bi interval>literal
[ >>literal ] [ >>literal? ] bi*
] if
- ] if ;
+ ] if ; inline
: <class/interval-info> ( class interval -- info )
<value-info>
] final-classes
] unit-test
+[ V{ integer array } ] [
+ [
+ [ 2drop T{ mixed-mutable-immutable f 3 { } } ]
+ [ { array } declare mixed-mutable-immutable boa ] if
+ [ x>> ] [ y>> ] bi
+ ] final-classes
+] unit-test
+
! Recursive propagation
: recursive-test-1 ( a -- b ) recursive-test-1 ; inline recursive
[ V{ fixnum } ] [ [ [ bignum-shift drop ] keep ] final-classes ] unit-test
+[ V{ float } ] [
+ [
+ [ { float float } declare <complex> ]
+ [ 2drop C{ 0.0 0.0 } ]
+ if real-part
+ ] final-classes
+] unit-test
+
! [ V{ string } ] [
! [ dup string? t xor [ "A" throw ] [ ] if ] final-classes
! ] unit-test
: tuple-constructor? ( word -- ? )
{ <tuple-boa> <complex> } memq? ;
-: read-only-slots ( values class -- slots )
- #! Delegation.
- all-slots rest-slice
- [ read-only>> [ drop f ] unless ] 2map
- { f f } prepend ;
-
: fold-<tuple-boa> ( values class -- info )
[ , f , [ literal>> ] map % ] { } make >tuple
<literal-info> ;