2020-04-20 17:08:45 +02:00
|
|
|
# Quotations
|
|
|
|
|
|
|
|
Quotes are anonymous functions. RETRO uses these as the basis for
|
|
|
|
executable flow control and combinatorial logic.
|
|
|
|
|
|
|
|
## Using Quotations
|
|
|
|
|
|
|
|
To make a quotation, surround the code with square brackets. E.g.,
|
|
|
|
|
|
|
|
#1 #2 eq? [ 'No_match s:put nl ] -if
|
|
|
|
|
|
|
|
Quotes can be nested:
|
|
|
|
|
|
|
|
[ #3 [ #4 ] dip ] call
|
|
|
|
|
|
|
|
After creation, a pointer to the quotation is left on the stack
|
|
|
|
(or is compiled into the current definition).
|
|
|
|
|
|
|
|
## Combinators
|
|
|
|
|
|
|
|
Words operating on quotations are called combinators; these are
|
|
|
|
discussed in *Using Combinators*.
|
|
|
|
|
|
|
|
## Implementation
|
|
|
|
|
|
|
|
A quotation is compiled as:
|
|
|
|
|
|
|
|
... code before quotation ...
|
|
|
|
i liju.... (if_compiling_only)
|
|
|
|
d address after quotation (if_compiling_only)
|
|
|
|
... code for quotation
|
|
|
|
i re...... (this_is_where_the_quote_ends)
|
|
|
|
i li......
|
|
|
|
d address of code for quotation
|
|
|
|
... code after quotation ....
|
|
|
|
|
|
|
|
## Other Notes
|
|
|
|
|
|
|
|
Quotations are used heavily in RETRO. They give the source a
|
|
|
|
feel that's different from traditional Forth, and allow for
|
|
|
|
a more consistent syntax.
|
|
|
|
|
|
|
|
For instance, in a traditional Forth, you might have some
|
|
|
|
conditionals:
|
|
|
|
|
|
|
|
IF ... THEN
|
|
|
|
IF ... ELSE ... THEN
|
|
|
|
IF ... EXIT THEN
|
|
|
|
|
|
|
|
RETRO uses conditional combinators for these:
|
|
|
|
|
|
|
|
[ ... ] if
|
|
|
|
[ ... ] [ ... ] choose
|
|
|
|
[ ... ] if;
|
|
|
|
|
|
|
|
Or loops:
|
|
|
|
|
|
|
|
FOR ... NEXT
|
|
|
|
|
|
|
|
Is replaced by:
|
|
|
|
|
|
|
|
[ ... ] times
|
|
|
|
|
|
|
|
This can also extend to stack flow. Sequences like:
|
|
|
|
|
|
|
|
>R ... >R
|
|
|
|
DUP >R ... >R
|
|
|
|
|
|
|
|
Become:
|
|
|
|
|
|
|
|
[ ... ] dip
|
|
|
|
[ ... ] sip
|
|
|
|
|
|
|
|
And forms like:
|
|
|
|
|
|
|
|
1 2 3 * swap 3 * swap
|
|
|
|
|
|
|
|
Can be replaced with a combinator like:
|
|
|
|
|
|
|
|
#1 #2 [ #3 * ] bi@
|
|
|
|
|
|
|
|
While there is a different set of words to learn, I find that
|
|
|
|
overall there's less noise from low level stack shuffling words
|
2020-04-27 19:44:03 +02:00
|
|
|
and the added consistency with regards to overall syntax has
|
2020-04-20 17:08:45 +02:00
|
|
|
been nice as I was never fond of the multiple forms that existed
|
|
|
|
in traditional Forth.
|