! Copyright (C) 2004, 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays assocs byte-arrays byte-vectors classes.algebra.private classes.builtin classes.error classes.intersection classes.maybe classes.mixin classes.parser classes.predicate classes.singleton classes.tuple classes.tuple.parser classes.union combinators compiler.units definitions delegate delegate.private effects effects.parser factor fry functors2 generic generic.hook generic.math generic.parser generic.standard hash-sets hashtables hashtables.identity hints init interpolate io.pathnames kernel lexer locals.errors locals.parser locals.types macros math memoize multiline namespaces parser quotations sbufs sequences slots source-files splitting stack-checker strings strings.parser system typed vectors vocabs.parser vocabs.platforms words words.alias words.constant words.inlined words.symbol ; IN: bootstrap.syntax ! These words are defined as a top-level form, instead of with ! defining parsing words, because during stage1 bootstrap, the ! "syntax" vocabulary is copied from the host. When stage1 ! bootstrap completes, the host's syntax vocabulary is deleted ! from the target, then this top-level form creates the ! target's "syntax" vocabulary as one of the first things done ! in stage2. : define-delimiter ( name -- ) "syntax" lookup-word t "delimiter" set-word-prop ; ! Keep track of words defined by SYNTAX: as opposed to words ! merely generated by define-syntax. : mark-top-level-syntax ( word -- word ) dup t "syntax" set-word-prop ; : define-core-syntax ( name quot -- ) [ dup "syntax" lookup-word [ ] [ no-word-error ] ?if mark-top-level-syntax ] dip define-syntax ; : define-dummy-fry ( name -- word ) "syntax" lookup-word [ "Only valid inside a fry" throw ] ( -- * ) [ define-declared ] 3keep 2drop ; : define-fry-specifier ( word words -- ) [ \ word ] dip [ member-eq? ] curry define-predicate-class ; : define-fry-specifiers ( names -- ) [ define-dummy-fry ] map dup [ define-fry-specifier ] curry each ; [ { "]" "}" ";" ">>" "UNIX>" "MACOS>" "LINUX>" "WINDOWS>" "FACTOR>" } [ define-delimiter ] each "PRIMITIVE:" [ current-vocab name>> scan-word scan-effect ensure-primitive ] define-core-syntax "CS{" [ "Call stack literals are not supported" throw ] define-core-syntax "IN:" [ scan-token set-current-vocab ] define-core-syntax "" [ end-private ] define-core-syntax "" parse-multiline-string os unix? [ ".unix" parse-platform-section ] [ drop ] if ] define-core-syntax "" parse-multiline-string os macosx? [ ".macos" parse-platform-section ] [ drop ] if ] define-core-syntax "" parse-multiline-string os linux? [ ".linux" parse-platform-section ] [ drop ] if ] define-core-syntax "" parse-multiline-string os windows? [ ".windows" parse-platform-section ] [ drop ] if ] define-core-syntax "" parse-multiline-string "" parse-platform-section ] define-core-syntax "USE:" [ scan-token use-vocab ] define-core-syntax "UNUSE:" [ scan-token unuse-vocab ] define-core-syntax "USING:" [ ";" [ use-vocab ] each-token ] define-core-syntax "QUALIFIED:" [ scan-token dup add-qualified ] define-core-syntax "QUALIFIED-WITH:" [ scan-token scan-token add-qualified ] define-core-syntax "FROM:" [ scan-token unescape-token "=>" expect ";" parse-tokens unescape-tokens add-words-from ] define-core-syntax "EXCLUDE:" [ scan-token unescape-token "=>" expect ";" parse-tokens unescape-tokens add-words-excluding ] define-core-syntax "RENAME:" [ scan-token unescape-token scan-token "=>" expect scan-token unescape-token add-renamed-word ] define-core-syntax "nan:" [ 16 scan-base suffix! ] define-core-syntax "f" [ f suffix! ] define-core-syntax "char:" [ lexer get parse-raw [ "token" throw-unexpected-eof ] unless* { { [ dup length 1 = ] [ first ] } { [ "\\" ?head ] [ next-escape >string "" assert= ] } [ name>char-hook get call( name -- char ) ] } cond suffix! ] define-core-syntax "\"" [ parse-string suffix! ] define-core-syntax "sbuf\"" [ parse-string >sbuf suffix! ] define-core-syntax "path\"" [ parse-string suffix! ] define-core-syntax "[" [ parse-quotation suffix! ] define-core-syntax "{" [ \ } [ >array ] parse-literal ] define-core-syntax "V{" [ \ } [ >vector ] parse-literal ] define-core-syntax "B{" [ \ } [ >byte-array ] parse-literal ] define-core-syntax "BV{" [ \ } [ >byte-vector ] parse-literal ] define-core-syntax "H{" [ \ } [ parse-hashtable ] parse-literal ] define-core-syntax "T{" [ parse-tuple-literal suffix! ] define-core-syntax "TH{" [ parse-tuple-hash-literal suffix! ] define-core-syntax "W{" [ \ } [ first ] parse-literal ] define-core-syntax "HS{" [ \ } [ >hash-set ] parse-literal ] define-core-syntax "postpone:" [ scan-syntax-word suffix! ] define-core-syntax "\\" [ scan-word suffix! ] define-core-syntax "M\\\\" [ scan-object scan-object lookup-method suffix! ] define-core-syntax "inline" [ last-word make-inline ] define-core-syntax "private" [ last-word make-private ] define-core-syntax "recursive" [ last-word make-recursive ] define-core-syntax "foldable" [ last-word make-foldable ] define-core-syntax "flushable" [ last-word make-flushable ] define-core-syntax "delimiter" [ last-word t "delimiter" set-word-prop ] define-core-syntax "deprecated" [ last-word make-deprecated ] define-core-syntax "SYNTAX:" [ scan-new-word mark-top-level-syntax parse-definition define-syntax ] define-core-syntax "BUILTIN:" [ scan-word-name current-vocab lookup-word (parse-tuple-definition) 2drop check-builtin ] define-core-syntax "INITIALIZED-SYMBOL:" [ scan-new-word [ define-symbol ] keep scan-object '[ _ _ initialize ] append! ] define-core-syntax ![[ "INITIALIZED-SYMBOL:" [ scan-new-word [ define-symbol ] [ name>> "initialize-" prepend create-word-in dup reset-generic scan-object dupd [ initialize ] curry curry ( -- ) define-declared ] bi ] define-core-syntax ]] "SYMBOL:" [ scan-new-word define-symbol ] define-core-syntax "SYMBOLS:" [ ";" [ create-word-in [ reset-generic ] [ define-symbol ] bi ] each-token ] define-core-syntax "STARTUP-HOOK:" [ scan-new-word scan-object [ ( -- ) define-declared ] [ swap startup-hooks get set-at ] 2bi ] define-core-syntax "SHUTDOWN-HOOK:" [ scan-new-word scan-object [ ( -- ) define-declared ] [ swap shutdown-hooks get set-at ] 2bi ] define-core-syntax "SINGLETONS:" [ ";" [ create-class-in define-singleton-class ] each-token ] define-core-syntax "DEFER:" [ scan-token current-vocab create-word [ fake-definition ] [ set-last-word ] [ undefined-def define ] tri ] define-core-syntax "ALIAS:" [ scan-new-word scan-word define-alias ] define-core-syntax "CONSTANT:" [ scan-new-word scan-object define-constant ] define-core-syntax ":" [ (:) apply-inlined-effects define-declared ] define-core-syntax "GENERIC:" [ [ simple-combination ] (GENERIC:) ] define-core-syntax "GENERIC#:" [ [ scan-number ] (GENERIC:) ] define-core-syntax "MATH:" [ [ math-combination ] (GENERIC:) ] define-core-syntax "HOOK:" [ [ scan-word ] (GENERIC:) ] define-core-syntax "M:" [ (M:) define ] define-core-syntax "UNION:" [ scan-new-class parse-array-def define-union-class ] define-core-syntax "INTERSECTION:" [ scan-new-class parse-array-def define-intersection-class ] define-core-syntax "MIXIN:" [ scan-new-class define-mixin-class ] define-core-syntax "INSTANCE:" [ location [ scan-word scan-word 2dup add-mixin-instance ] dip remember-definition ] define-core-syntax "PREDICATE:" [ scan-new-class "<" expect scan-class parse-definition define-predicate-class ] define-core-syntax "SINGLETON:" [ scan-new-class define-singleton-class ] define-core-syntax "TUPLE:" [ parse-tuple-definition define-tuple-class ] define-core-syntax "final" [ last-word make-final ] define-core-syntax "SLOT:" [ scan-token define-protocol-slot ] define-core-syntax "C:" [ scan-new-word scan-word define-boa-word ] define-core-syntax "ERROR:" [ parse-tuple-definition pick save-location define-error-class ] define-core-syntax "FORGET:" [ scan-object forget ] define-core-syntax "(" [ ")" parse-effect suffix! ] define-core-syntax "MAIN:" [ scan-word dup ( -- ) check-stack-effect [ current-vocab main<< ] [ current-source-file get [ main<< ] [ drop ] if* ] bi ] define-core-syntax "<<" [ [ \ >> parse-until >quotation ] with-nested-compilation-unit call( -- ) ] define-core-syntax "call-next-method" [ current-method get [ literalize suffix! \ (call-next-method) suffix! ] [ not-in-a-method-error ] if* ] define-core-syntax "maybe{" [ \ } [ ] parse-literal ] define-core-syntax "not{" [ \ } [ ] parse-literal ] define-core-syntax "intersection{" [ \ } [ ] parse-literal ] define-core-syntax "union{" [ \ } [ ] parse-literal ] define-core-syntax "initial:" "syntax" lookup-word define-symbol "read-only" "syntax" lookup-word define-symbol "call(" [ \ call-effect parse-call-paren ] define-core-syntax "execute(" [ \ execute-effect parse-call-paren ] define-core-syntax "IH{" [ \ } [ >identity-hashtable ] parse-literal ] define-core-syntax "::" [ (::) apply-inlined-effects define-declared ] define-core-syntax "M::" [ (M::) define ] define-core-syntax "MACRO:" [ (:) apply-inlined-effects define-macro ] define-core-syntax "MACRO::" [ (::) apply-inlined-effects define-macro ] define-core-syntax "TYPED:" [ (:) apply-inlined-effects define-typed ] define-core-syntax "TYPED::" [ (::) apply-inlined-effects define-typed ] define-core-syntax "MEMO:" [ (:) apply-inlined-effects define-memoized ] define-core-syntax "MEMO::" [ (::) apply-inlined-effects define-memoized ] define-core-syntax "MEMO[" [ parse-quotation dup infer memoize-quot suffix! ] define-core-syntax "IDENTITY-MEMO:" [ (:) apply-inlined-effects define-identity-memoized ] define-core-syntax "IDENTITY-MEMO::" [ (::) apply-inlined-effects define-identity-memoized ] define-core-syntax "'[" [ parse-quotation fry append! ] define-core-syntax "':" [ (:) [ fry '[ @ call ] ] [ apply-inlined-effects ] bi* define-declared ] define-core-syntax "PROTOCOL:" [ scan-new-word parse-definition define-protocol ] define-core-syntax "CONSULT:" [ scan-word scan-word parse-definition [ save-location ] [ define-consult ] bi ] define-core-syntax "BROADCAST:" [ scan-word scan-word parse-definition [ save-location ] [ define-consult ] bi ] define-core-syntax "SLOT-PROTOCOL:" [ scan-new-word ";" [ [ reader-word ] [ writer-word ] bi 2array ] map-tokens concat define-protocol ] define-core-syntax "HINTS:" [ scan-object dup wrapper? [ wrapped>> ] when [ changed-definition ] [ subwords [ changed-definition ] each ] [ parse-definition { } like set-specializer ] tri ] define-core-syntax { "_" "@" } define-fry-specifiers "factor[[" [ "]]" parse-multiline-string0 suffix! ] define-core-syntax "factor[=[" [ "]=]" parse-multiline-string0 suffix! ] define-core-syntax "factor[==[" [ "]==]" parse-multiline-string0 suffix! ] define-core-syntax "factor[===[" [ "]===]" parse-multiline-string0 suffix! ] define-core-syntax "factor[====[" [ "]====]" parse-multiline-string0 suffix! ] define-core-syntax "factor[=====[" [ "]=====]" parse-multiline-string0 suffix! ] define-core-syntax "factor[======[" [ "]======]" parse-multiline-string0 suffix! ] define-core-syntax "[[" [ "]]" parse-multiline-string0 suffix! ] define-core-syntax "[=[" [ "]=]" parse-multiline-string0 suffix! ] define-core-syntax "[==[" [ "]==]" parse-multiline-string0 suffix! ] define-core-syntax "[===[" [ "]===]" parse-multiline-string0 suffix! ] define-core-syntax "[====[" [ "]====]" parse-multiline-string0 suffix! ] define-core-syntax "[=====[" [ "]=====]" parse-multiline-string0 suffix! ] define-core-syntax "[======[" [ "]======]" parse-multiline-string0 suffix! ] define-core-syntax "![[" [ "]]" parse-multiline-string0 drop ] define-core-syntax "![=[" [ "]=]" parse-multiline-string0 drop ] define-core-syntax "![==[" [ "]==]" parse-multiline-string0 drop ] define-core-syntax "![===[" [ "]===]" parse-multiline-string0 drop ] define-core-syntax "![====[" [ "]====]" parse-multiline-string0 drop ] define-core-syntax "![=====[" [ "]=====]" parse-multiline-string0 drop ] define-core-syntax "![======[" [ "]======]" parse-multiline-string0 drop ] define-core-syntax "I[[" [ "]]" define-interpolate-syntax ] define-core-syntax "I[=[" [ "]=]" define-interpolate-syntax ] define-core-syntax "I[==[" [ "]==]" define-interpolate-syntax ] define-core-syntax "I[===[" [ "]===]" define-interpolate-syntax ] define-core-syntax "I[====[" [ "]====]" define-interpolate-syntax ] define-core-syntax "I[=====[" [ "]=====]" define-interpolate-syntax ] define-core-syntax "I[======[" [ "]======]" define-interpolate-syntax ] define-core-syntax ":>" [ in-lambda? get [ :>-outside-lambda-error ] unless scan-token parse-def suffix! ] define-core-syntax "|[" [ parse-lambda append! ] define-core-syntax "let[" [ parse-let append! ] define-core-syntax "'let[" [ H{ } clone (parse-lambda) [ fry call ?rewrite-closures call ] curry append! ] define-core-syntax "FUNCTOR:" [ scan-new-word scan-effect scan-object make-functor ] define-core-syntax "VARIABLES-FUNCTOR:" [ scan-new-word scan-effect scan-object scan-object make-variable-functor ] define-core-syntax ] with-compilation-unit