b2ac237c35
FossilOrigin-Name: 61bec5c3ab74da3be2fa090a346b667bfa03cea534d8b378b9ac3245412bdc72
46 lines
2 KiB
Text
46 lines
2 KiB
Text
## Prefixes as a Language Element
|
|
|
|
A big change in RETRO 12 was the elimination of the traditional
|
|
parser from the language. This was a sacrifice due to the lack
|
|
of an I/O model. RETRO has no way to know *how* input is given
|
|
to the `interpret` word, or whether anything else will ever be
|
|
passed into it.
|
|
|
|
And so `interpret` operates only on the current token. The core
|
|
language does not track what came before or attempt to guess at
|
|
what might come in the future.
|
|
|
|
This leads into the prefixes. RETRO 11 had a complicated system
|
|
for prefixes, with different types of prefixes for words that
|
|
parsed ahead (e.g., strings) and words that operated on the
|
|
current token (e.g., `@`). RETRO 12 eliminates all of these in
|
|
favor of just having a single prefix model.
|
|
|
|
The first thing `interpret` does is look to see if the first
|
|
character in a token matches a `prefix:` word. If it does, it
|
|
passes the rest of the token as a string pointer to the prefix
|
|
specific handler to deal with. If there is no valid prefix
|
|
found, it tries to find it in the dictionary. Assuming that it
|
|
finds the words, it passes the `d:xt` field to the handler that
|
|
`d:class` points to. Otherwise it calls `err:notfound`.
|
|
|
|
This has an important implication: *words can not reliably
|
|
have names that start with a prefix character.*
|
|
|
|
It also simplifies things. Anything that would normally parse
|
|
becomes a prefix handler. So creating a new word? Use the `:`
|
|
prefix. Strings? Use `'`. Pointers? Try `&`. And so on. E.g.,
|
|
|
|
In ANS | In RETRO
|
|
: foo ... ; | :foo ... ;
|
|
' foo | &foo
|
|
: bar ... ['] foo ; | :bar ... &foo ;
|
|
s" hello world!" | 'hello_world!
|
|
|
|
If you are familiar with ColorForth, prefixes are a similar
|
|
idea to colors, but can be defined by the user as normal words.
|
|
|
|
After doing this for quite a while I rather like it. I can see
|
|
why Chuck Moore eventually went towards ColorForth as using
|
|
color (or prefixes in my case) does simplify the implementation
|
|
in many ways.
|