If you've been paying close attention so far, you will realize that you have been lied to.
Most words act on the stack in order, but there a few words like
[,
],
: and
; that don't seem to follow this rule.
These are
parsing words and they behave differently from ordinary words like
5,
[1..b] or
drop. We will cover these in more detail when we talk about metaprogramming, but for now it is enough to know that parsing words are special.
They are not defined using the
: word, but with the word
SYNTAX: instead. When a parsing words is encountered, it can interact with the parser using a well-defined API to influence how successive words are parsed. For instance
: asks for the next token from the parser until
; is found and tries to compile that stream of tokens into a word definition.
A common use of parsing words is to define literals. For instance
{ is a parsing word that starts an array definition and is terminated by
}. Everything in-between is part of the array. An example of array that we have seen before is
{ 1 2 3 4 5 6 7 8 9 10 } .
There are also literals for hashmaps,
H{ { "Perl" "Larry Wall" } { "Factor" "Slava Pestov" } { "Scala" "Martin Odersky" } } , and byte arrays,
B{ 1 14 18 23 } .
Other uses of parsing words include the module system, the object-oriented features of Factor, enums, memoized functions, privacy modifiers and more. In theory, even
SYNTAX: can be defined in terms of itself, but the system has to be bootstrapped somehow.