1 ! Copyright (C) 2004, 2007 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays definitions graphs assocs kernel kernel.private
5 slots.private math namespaces sequences strings vectors sbufs
6 quotations assocs hashtables sorting math.parser words.private
9 GENERIC: execute ( word -- )
11 M: word execute (execute) ;
13 : word ( -- word ) \ word get-global ;
15 : set-word ( word -- ) \ word set-global ;
17 ! Used by the compiler
20 : word-changed? ( word -- ? )
21 changed-words get [ key? ] [ drop f ] if* ;
23 : changed-word ( word -- )
24 dup changed-words get [ set-at ] [ 2drop ] if* ;
26 : unchanged-word ( word -- )
27 changed-words get [ delete-at ] [ drop ] if* ;
30 [ dup word-name swap word-vocabulary 2array ] compare ;
32 M: word definition drop f ;
34 PREDICATE: word undefined ( obj -- ? ) word-def not ;
35 M: undefined definer drop \ DEFER: f ;
37 PREDICATE: word compound ( obj -- ? ) word-def quotation? ;
39 M: compound definer drop \ : \ ; ;
41 M: compound definition word-def ;
43 PREDICATE: word primitive ( obj -- ? ) word-def fixnum? ;
44 M: primitive definer drop \ PRIMITIVE: f ;
46 PREDICATE: word symbol ( obj -- ? ) word-def t eq? ;
47 M: symbol definer drop \ SYMBOL: f ;
49 : word-prop ( word name -- value ) swap word-props at ;
51 : remove-word-prop ( word name -- )
52 swap word-props delete-at ;
54 : set-word-prop ( word value name -- )
56 [ pick word-props ?set-at swap set-word-props ]
57 [ nip remove-word-prop ] if ;
59 : reset-props ( word seq -- ) [ remove-word-prop ] curry* each ;
61 : lookup ( name vocab -- word ) vocab-words at ;
63 : target-word ( word -- target )
64 dup word-name swap word-vocabulary lookup ;
66 SYMBOL: bootstrapping?
68 : if-bootstrapping ( true false -- )
69 bootstrapping? get -rot if ; inline
71 : bootstrap-word ( word -- target )
72 [ target-word ] [ ] if-bootstrapping ;
74 PREDICATE: word interned dup target-word eq? ;
76 GENERIC# (quot-uses) 1 ( obj assoc -- )
78 M: object (quot-uses) 2drop ;
80 M: interned (quot-uses) dupd set-at ;
82 : seq-uses ( seq assoc -- ) [ (quot-uses) ] curry each ;
84 M: array (quot-uses) seq-uses ;
86 M: callable (quot-uses) seq-uses ;
88 M: wrapper (quot-uses) >r wrapped r> (quot-uses) ;
90 : quot-uses ( quot -- assoc )
91 global [ H{ } clone [ (quot-uses) ] keep ] bind ;
93 M: word uses ( word -- seq )
94 word-def quot-uses keys ;
96 M: compound redefined* ( word -- )
98 { "inferred-effect" "base-case" "no-effect" } reset-props ;
102 : definition-changed? ( word def -- ? )
103 swap word-def = not ;
105 : define ( word def -- )
106 2dup definition-changed? [
111 dup word-vocabulary [
112 dup changed-word dup xref
120 : define-symbol ( word -- ) t define ;
122 : intern-symbol ( word -- )
123 dup undefined? [ define-symbol ] [ drop ] if ;
125 : define-compound ( word def -- ) [ ] like define ;
127 : define-declared ( word def effect -- )
128 pick swap "declared-effect" set-word-prop
131 : make-inline ( word -- )
132 t "inline" set-word-prop ;
134 : make-flushable ( word -- )
135 t "flushable" set-word-prop ;
137 : make-foldable ( word -- )
138 dup make-flushable t "foldable" set-word-prop ;
140 : define-inline ( word quot -- )
141 dupd define-compound make-inline ;
143 : reset-word ( word -- )
145 "parsing" "inline" "foldable"
149 "declared-effect" "constructor-quot" "delimiter"
152 : reset-generic ( word -- )
153 dup reset-word { "methods" "combination" } reset-props ;
156 "G:" \ gensym counter number>string append f <word> ;
158 : define-temp ( quot -- word )
159 gensym [ swap define-compound ] keep ;
162 dup word-name over word-vocabulary vocab-words set-at ;
164 TUPLE: check-create name vocab ;
166 : check-create ( name vocab -- name vocab )
167 2dup [ string? ] both? [
168 \ check-create construct-boa throw
171 : create ( name vocab -- word )
172 check-create 2dup lookup
173 dup [ 2nip ] [ drop <word> dup reveal ] if ;
175 : constructor-word ( name vocab -- word )
176 >r "<" swap ">" 3append r> create ;
178 : parsing? ( obj -- ? )
179 dup word? [ "parsing" word-prop ] [ drop f ] if ;
181 : delimiter? ( obj -- ? )
182 dup word? [ "delimiter" word-prop ] [ drop f ] if ;
184 ! Definition protocol
185 M: word where "loc" word-prop ;
187 M: word set-where swap "loc" set-word-prop ;
189 GENERIC: (forget-word) ( word -- )
191 M: interned (forget-word)
192 dup word-name swap word-vocabulary vocab-words delete-at ;
194 M: word (forget-word)
197 : rename-word ( word newname newvocab -- )
199 pick set-word-vocabulary
203 : forget-word ( word -- )
204 dup f "methods" set-word-prop
209 M: word forget forget-word ;
212 nip 1 slot { fixnum } declare ;
214 M: word literalize <wrapper> ;
216 : ?word-name dup word? [ word-name ] when ;
218 : xref-words ( -- ) all-words [ xref ] each ;