]> gitweb.factorcode.org Git - factor.git/blob - core/syntax/syntax.factor
syntax: don't mark-top-level-syntax.
[factor.git] / core / syntax / syntax.factor
1 ! Copyright (C) 2004, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays byte-arrays byte-vectors classes
4 classes.algebra.private classes.builtin classes.error
5 classes.intersection classes.maybe classes.mixin classes.parser
6 classes.predicate classes.singleton classes.tuple
7 classes.tuple.parser classes.union combinators compiler.units
8 definitions effects effects.parser fry generic generic.hook
9 generic.math generic.parser generic.standard hash-sets
10 hashtables hashtables.identity io.pathnames kernel lexer
11 locals.errors locals.parser macros math memoize namespaces
12 parser quotations sbufs sequences slots source-files splitting
13 strings strings.parser vectors vocabs.parser words words.alias
14 words.constant words.symbol ;
15 IN: bootstrap.syntax
16
17 ! These words are defined as a top-level form, instead of with
18 ! defining parsing words, because during stage1 bootstrap, the
19 ! "syntax" vocabulary is copied from the host. When stage1
20 ! bootstrap completes, the host's syntax vocabulary is deleted
21 ! from the target, then this top-level form creates the
22 ! target's "syntax" vocabulary as one of the first things done
23 ! in stage2.
24
25 : define-delimiter ( name -- )
26     "syntax" lookup-word t "delimiter" set-word-prop ;
27
28 : define-core-syntax ( name quot -- )
29     [ dup "syntax" lookup-word [ ] [ no-word-error ] ?if ] dip
30     define-syntax ;
31
32 [
33     { "]" "}" ";" ">>" } [ define-delimiter ] each
34
35     "PRIMITIVE:" [
36         current-vocab name>>
37         scan-word scan-effect ensure-primitive
38     ] define-core-syntax
39
40     "CS{" [
41         "Call stack literals are not supported" throw
42     ] define-core-syntax
43
44     "IN:" [ scan-token set-current-vocab ] define-core-syntax
45
46     "<PRIVATE" [ begin-private ] define-core-syntax
47
48     "PRIVATE>" [ end-private ] define-core-syntax
49
50     "USE:" [ scan-token use-vocab ] define-core-syntax
51
52     "UNUSE:" [ scan-token unuse-vocab ] define-core-syntax
53
54     "USING:" [ ";" [ use-vocab ] each-token ] define-core-syntax
55
56     "QUALIFIED:" [ scan-token dup add-qualified ] define-core-syntax
57
58     "QUALIFIED-WITH:" [ scan-token scan-token add-qualified ] define-core-syntax
59
60     "FROM:" [
61         scan-token "=>" expect ";" parse-tokens add-words-from
62     ] define-core-syntax
63
64     "EXCLUDE:" [
65         scan-token "=>" expect ";" parse-tokens add-words-excluding
66     ] define-core-syntax
67
68     "RENAME:" [
69         scan-token scan-token "=>" expect scan-token add-renamed-word
70     ] define-core-syntax
71
72     "NAN:" [ 16 scan-base <fp-nan> suffix! ] define-core-syntax
73
74     "f" [ f suffix! ] define-core-syntax
75
76     "CHAR:" [
77         lexer get parse-raw [ "token" throw-unexpected-eof ] unless* {
78             { [ dup length 1 = ] [ first ] }
79             { [ "\\" ?head ] [ next-escape >string "" assert= ] }
80             [ name>char-hook get call( name -- char ) ]
81         } cond suffix!
82     ] define-core-syntax
83
84     "\"" [ parse-string suffix! ] define-core-syntax
85
86     "SBUF\"" [
87         lexer get skip-blank parse-string >sbuf suffix!
88     ] define-core-syntax
89
90     "P\"" [
91         lexer get skip-blank parse-string <pathname> suffix!
92     ] define-core-syntax
93
94     "[" [ parse-quotation suffix! ] define-core-syntax
95     "{" [ \ } [ >array ] parse-literal ] define-core-syntax
96     "V{" [ \ } [ >vector ] parse-literal ] define-core-syntax
97     "B{" [ \ } [ >byte-array ] parse-literal ] define-core-syntax
98     "BV{" [ \ } [ >byte-vector ] parse-literal ] define-core-syntax
99     "H{" [ \ } [ parse-hashtable ] parse-literal ] define-core-syntax
100     "IH{" [ \ } [ >identity-hashtable ] parse-literal ] define-core-syntax
101     "T{" [ parse-tuple-literal suffix! ] define-core-syntax
102     "W{" [ \ } [ first <wrapper> ] parse-literal ] define-core-syntax
103     "HS{" [ \ } [ >hash-set ] parse-literal ] define-core-syntax
104
105     "POSTPONE:" [ scan-word suffix! ] define-core-syntax
106     "\\" [ scan-word <wrapper> suffix! ] define-core-syntax
107     "M\\" [ scan-word scan-word lookup-method <wrapper> suffix! ] define-core-syntax
108     "inline" [ last-word make-inline ] define-core-syntax
109     "recursive" [ last-word make-recursive ] define-core-syntax
110     "foldable" [ last-word make-foldable ] define-core-syntax
111     "flushable" [ last-word make-flushable ] define-core-syntax
112     "delimiter" [ last-word t "delimiter" set-word-prop ] define-core-syntax
113     "deprecated" [ last-word make-deprecated ] define-core-syntax
114
115     "SYNTAX:" [
116         scan-new-word parse-definition define-syntax
117     ] define-core-syntax
118
119     "BUILTIN:" [
120         scan-word-name
121         current-vocab lookup-word
122         (parse-tuple-definition)
123         2drop builtin-class check-instance drop
124     ] define-core-syntax
125
126     "SYMBOL:" [
127         scan-new-word define-symbol
128     ] define-core-syntax
129
130     "SYMBOLS:" [
131         ";" [ create-word-in [ reset-generic ] [ define-symbol ] bi ] each-token
132     ] define-core-syntax
133
134     "SINGLETONS:" [
135         ";" [ create-class-in define-singleton-class ] each-token
136     ] define-core-syntax
137
138     "DEFER:" [
139         scan-token current-vocab create-word
140         [ fake-definition ] [ set-last-word ] [ undefined-def define ] tri
141     ] define-core-syntax
142
143     "ALIAS:" [
144         scan-new-word scan-word define-alias
145     ] define-core-syntax
146
147     "CONSTANT:" [
148         scan-new-word scan-object define-constant
149     ] define-core-syntax
150
151     ":" [
152         (:) define-declared
153     ] define-core-syntax
154
155     "GENERIC:" [
156         [ simple-combination ] (GENERIC:)
157     ] define-core-syntax
158
159     "GENERIC#:" [
160         [ scan-number <standard-combination> ] (GENERIC:)
161     ] define-core-syntax
162
163     "MATH:" [
164         [ math-combination ] (GENERIC:)
165     ] define-core-syntax
166
167     "HOOK:" [
168         [ scan-word <hook-combination> ] (GENERIC:)
169     ] define-core-syntax
170
171     "M:" [
172         (M:) define
173     ] define-core-syntax
174
175     "UNION:" [
176         scan-new-class parse-array-def define-union-class
177     ] define-core-syntax
178
179     "INTERSECTION:" [
180         scan-new-class parse-array-def define-intersection-class
181     ] define-core-syntax
182
183     "MIXIN:" [
184         scan-new-class define-mixin-class
185     ] define-core-syntax
186
187     "INSTANCE:" [
188         location [
189             scan-word scan-word 2dup add-mixin-instance
190             <mixin-instance>
191         ] dip remember-definition
192     ] define-core-syntax
193
194     "PREDICATE:" [
195         scan-new-class
196         "<" expect
197         scan-class
198         parse-definition define-predicate-class
199     ] define-core-syntax
200
201     "SINGLETON:" [
202         scan-new-class define-singleton-class
203     ] define-core-syntax
204
205     "TUPLE:" [
206         parse-tuple-definition define-tuple-class
207     ] define-core-syntax
208
209     "final" [
210         last-word make-final
211     ] define-core-syntax
212
213     "SLOT:" [
214         scan-token define-protocol-slot
215     ] define-core-syntax
216
217     "C:" [
218         scan-new-word scan-word define-boa-word
219     ] define-core-syntax
220
221     "ERROR:" [
222         parse-tuple-definition
223         pick save-location
224         define-error-class
225     ] define-core-syntax
226
227     "FORGET:" [
228         scan-object forget
229     ] define-core-syntax
230
231     "(" [
232         ")" parse-effect suffix!
233     ] define-core-syntax
234
235     "MAIN:" [
236         scan-word dup \ [ = [
237             drop "( main )" <uninterned-word> dup
238             parse-quotation ( -- ) define-declared
239         ] when dup ( -- ) check-stack-effect
240         [ current-vocab main<< ]
241         [ current-source-file get [ main<< ] [ drop ] if* ] bi
242     ] define-core-syntax
243
244     "<<" [
245         [
246             \ >> parse-until >quotation
247         ] with-nested-compilation-unit call( -- )
248     ] define-core-syntax
249
250     "call-next-method" [
251         current-method get [
252             literalize suffix!
253             \ (call-next-method) suffix!
254         ] [
255             not-in-a-method-error
256         ] if*
257     ] define-core-syntax
258
259     "maybe{" [
260         \ } [ <anonymous-union> <maybe> ] parse-literal
261     ] define-core-syntax
262
263     "not{" [
264         \ } [ <anonymous-union> <anonymous-complement> ] parse-literal
265     ] define-core-syntax
266
267     "intersection{" [
268          \ } [ <anonymous-intersection> ] parse-literal
269     ] define-core-syntax
270
271     "union{" [
272         \ } [ <anonymous-union> ] parse-literal
273     ] define-core-syntax
274
275     "initial:" "syntax" lookup-word define-symbol
276
277     "read-only" "syntax" lookup-word define-symbol
278
279     "call(" [ \ call-effect parse-call-paren ] define-core-syntax
280
281     "execute(" [ \ execute-effect parse-call-paren ] define-core-syntax
282
283     "<<<<<<<" [ version-control-merge-conflict ] define-core-syntax
284     "=======" [ version-control-merge-conflict ] define-core-syntax
285     ">>>>>>>" [ version-control-merge-conflict ] define-core-syntax
286
287     "<<<<<<" [ version-control-merge-conflict ] define-core-syntax
288     "======" [ version-control-merge-conflict ] define-core-syntax
289     ">>>>>>" [ version-control-merge-conflict ] define-core-syntax
290
291     "'[" [
292          t in-fry? [ parse-quotation ] with-variable fry append!
293     ] define-core-syntax
294
295     "'{" [
296          t in-fry? [ \ } parse-until >array ] with-variable fry append!
297     ] define-core-syntax
298
299     "'HS{" [
300          t in-fry? [ \ } parse-until >array ] with-variable fry
301          [ >hash-set ] compose append!
302     ] define-core-syntax
303
304     "'H{" [
305          t in-fry? [ \ } parse-until >array ] with-variable fry
306          [ parse-hashtable ] compose append!
307     ] define-core-syntax
308
309     "_" [
310         in-fry? get [ \ _ suffix! ] [ not-in-a-fry ] if
311     ] define-core-syntax
312
313     "@" [
314         in-fry? get [ \ @ suffix! ] [ not-in-a-fry ] if
315     ] define-core-syntax
316
317     "MACRO:" [ (:) define-macro ] define-core-syntax
318
319     "MEMO:" [ (:) define-memoized ] define-core-syntax
320     "IDENTITY-MEMO:" [ (:) define-identity-memoized ] define-core-syntax
321
322     ":>" [
323         in-lambda? get [ :>-outside-lambda-error ] unless
324         scan-token parse-def suffix!
325     ] define-core-syntax
326     "[|" [ parse-lambda append! ] define-core-syntax
327     "[let" [ parse-let append! ] define-core-syntax
328
329     "::" [ (::) define-declared ] define-core-syntax
330     "M::" [ (M::) define ] define-core-syntax
331     "MACRO::" [ (::) define-macro ] define-core-syntax
332     "MEMO::" [ (::) define-memoized ] define-core-syntax
333     "IDENTITY-MEMO::" [ (::) define-identity-memoized ] define-core-syntax
334 ] with-compilation-unit