1 ! Copyright (C) 2004, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays definitions kernel kernel.private
4 slots.private math namespaces sequences strings vectors sbufs
5 quotations assocs hashtables sorting vocabs math.order sets
9 : word ( -- word ) \ word get-global ;
11 : set-word ( word -- ) \ word set-global ;
13 M: word execute (execute) ;
15 M: word ?execute execute( -- value ) ; inline
18 [ [ name>> ] [ vocabulary>> ] bi 2array ] compare ;
20 M: word definer drop \ : \ ; ;
22 M: word definition def>> ;
26 PREDICATE: deferred < word ( obj -- ? )
27 def>> [ undefined ] = ;
28 M: deferred definer drop \ DEFER: f ;
29 M: deferred definition drop f ;
31 PREDICATE: primitive < word ( obj -- ? )
32 [ def>> [ do-primitive ] tail? ]
33 [ sub-primitive>> >boolean ]
35 M: primitive definer drop \ PRIMITIVE: f ;
36 M: primitive definition drop f ;
38 : word-prop ( word name -- value ) swap props>> at ;
40 : remove-word-prop ( word name -- ) swap props>> delete-at ;
42 : set-word-prop ( word value name -- )
44 [ pick props>> ?set-at >>props drop ]
45 [ nip remove-word-prop ] if ;
47 : reset-props ( word seq -- ) [ remove-word-prop ] with each ;
49 : lookup ( name vocab -- word ) vocab-words at ;
51 : target-word ( word -- target )
52 [ name>> ] [ vocabulary>> ] bi lookup ;
54 SYMBOL: bootstrapping?
56 : if-bootstrapping ( true false -- )
57 [ bootstrapping? get ] 2dip if ; inline
59 : bootstrap-word ( word -- target )
60 [ target-word ] [ ] if-bootstrapping ;
62 GENERIC: crossref? ( word -- ? )
65 dup "forgotten" word-prop [ drop f ] [ vocabulary>> >boolean ] if ;
67 : inline? ( word -- ? ) "inline" word-prop ; inline
69 GENERIC: subwords ( word -- seq )
71 M: word subwords drop f ;
73 : define ( word def -- )
74 over changed-definition [ ] like >>def drop ;
76 : changed-effect ( word -- )
77 [ dup changed-effects get set-in-unit ]
78 [ dup primitive? [ drop ] [ changed-definition ] if ] bi ;
80 : set-stack-effect ( effect word -- )
81 2dup "declared-effect" word-prop = [ 2drop ] [
82 [ nip changed-effect ]
83 [ nip subwords [ changed-effect ] each ]
84 [ swap "declared-effect" set-word-prop ]
88 : define-declared ( word def effect -- )
89 [ nip swap set-stack-effect ] [ drop define ] 3bi ;
91 : make-deprecated ( word -- )
92 t "deprecated" set-word-prop ;
94 : make-inline ( word -- )
95 dup inline? [ drop ] [
96 [ t "inline" set-word-prop ]
101 : make-recursive ( word -- )
102 t "recursive" set-word-prop ;
104 : make-flushable ( word -- )
105 t "flushable" set-word-prop ;
107 : make-foldable ( word -- )
108 dup make-flushable t "foldable" set-word-prop ;
110 : define-inline ( word def effect -- )
111 [ define-declared ] [ 2drop make-inline ] 3bi ;
113 GENERIC: reset-word ( word -- )
117 "unannotated-def" "parsing" "inline" "recursive"
118 "foldable" "flushable" "reading" "writing" "reader"
119 "writer" "delimiter" "deprecated"
122 : reset-generic ( word -- )
123 [ subwords forget-all ]
137 : <word> ( name vocab -- word )
138 2dup [ hashcode ] bi@ bitxor >fixnum (word) dup new-word ;
140 : <uninterned-word> ( name -- word )
141 f \ <uninterned-word> counter >fixnum (word) ;
144 "( gensym )" <uninterned-word> ;
146 : define-temp ( quot effect -- word )
147 [ gensym dup ] 2dip define-declared ;
150 dup [ name>> ] [ vocabulary>> ] bi dup vocab-words
154 ERROR: bad-create name vocab ;
156 : check-create ( name vocab -- name vocab )
157 2dup [ string? ] [ [ string? ] [ vocab? ] bi or ] bi* and
158 [ bad-create ] unless ;
160 : create ( name vocab -- word )
161 check-create 2dup lookup
162 dup [ 2nip ] [ drop vocab-name <word> dup reveal ] if ;
164 : constructor-word ( name vocab -- word )
165 [ "<" ">" surround ] dip create ;
167 PREDICATE: parsing-word < word "parsing" word-prop ;
169 M: parsing-word definer drop \ SYNTAX: \ ; ;
171 : define-syntax ( word quot -- )
172 [ drop ] [ define ] 2bi t "parsing" set-word-prop ;
174 : delimiter? ( obj -- ? )
175 dup word? [ "delimiter" word-prop ] [ drop f ] if ;
177 : deprecated? ( obj -- ? )
178 dup word? [ "deprecated" word-prop ] [ drop f ] if ;
180 ! Definition protocol
181 M: word where "loc" word-prop ;
183 M: word set-where swap "loc" set-word-prop ;
186 dup "forgotten" word-prop [ drop ] [
187 [ [ name>> ] [ vocabulary>> vocab-words ] bi delete-at ]
188 [ t "forgotten" set-word-prop ]
193 nip 1 slot { fixnum } declare ; inline foldable
195 M: word literalize <wrapper> ;
197 INSTANCE: word definition