1 ! Copyright (C) 2007, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays kernel words sequences generic math namespaces
4 quotations assocs combinators math.bitfields inference.backend
5 inference.dataflow inference.state classes.tuple.private effects
6 inspector hashtables classes generic sets definitions ;
7 IN: inference.transforms
9 : pop-literals ( n -- rstate seq )
11 drop recursive-state get { }
14 f swap [ 2drop pop-literal ] map reverse
17 : transform-quot ( quot n -- newquot )
18 [ pop-literals [ ] each ] curry
20 [ swap infer-quot ] 3compose ;
22 : define-transform ( word quot n -- )
23 transform-quot "infer" set-word-prop ;
35 dup peek swap but-last
42 \ cleave [ cleave>quot ] 1 define-transform
44 \ 2cleave [ 2cleave>quot ] 1 define-transform
46 \ 3cleave [ 3cleave>quot ] 1 define-transform
48 \ spread [ spread>quot ] 1 define-transform
51 GENERIC: (bitfield-quot) ( spec -- quot )
53 M: integer (bitfield-quot) ( spec -- quot )
54 [ swapd shift bitor ] curry ;
56 M: pair (bitfield-quot) ( spec -- quot )
57 first2 over word? [ >r swapd execute r> ] [ ] ?
58 [ shift bitor ] append 2curry ;
60 : bitfield-quot ( spec -- quot )
61 [ (bitfield-quot) ] map [ 0 ] prefix concat ;
63 \ bitfield [ bitfield-quot ] 1 define-transform
66 [ 0 , [ , \ bitor , ] each ] [ ] make
70 : [get-slots] ( slots -- quot )
71 [ [ 1quotation , \ keep , ] each \ drop , ] [ ] make ;
73 \ get-slots [ [get-slots] ] 1 define-transform
75 ERROR: duplicated-slots-error names ;
77 M: duplicated-slots-error summary
78 drop "Calling set-slots with duplicate slot setters" ;
82 [ <reversed> [get-slots] ] [ duplicated-slots-error ] if
86 dup +inlined+ depends-on
87 tuple-layout [ <tuple-boa> ] curry
94 dup +inlined+ depends-on
95 tuple-layout [ <tuple> ] curry
98 \ new 1 1 <effect> make-call-node
100 ] "infer" set-word-prop
103 [ +inlined+ depends-on ] [ "predicate" word-prop ] bi
106 \ (call-next-method) [
107 [ [ +inlined+ depends-on ] bi@ ] [ next-method-quot ] 2bi