add quad quad* and quad@ as examples
FossilOrigin-Name: 9b50fa422adef2cc666629192d6acb81455506881cf4a665bf988f5ae336ea53
This commit is contained in:
parent
b78195287d
commit
20ff1927ea
2 changed files with 498 additions and 2 deletions
52
example/quad.forth
Normal file
52
example/quad.forth
Normal file
|
@ -0,0 +1,52 @@
|
|||
The standard RETRO language provides `bi` and `tri` combinators to apply quotes to two or three values in various combinations. Sometimes it may be necessary to do this with four values.
|
||||
|
||||
Note that this is *ugly* code. It's functional, but if you can refactor to avoid needing it, it'll likely be better in the long run.
|
||||
|
||||
`quad` applies four quotes to a value. These are equivilent:
|
||||
|
||||
#10 [ #1 + ] call
|
||||
#10 [ #1 - ] call
|
||||
#10 [ #2 + ] call
|
||||
#10 [ #3 + ] call
|
||||
|
||||
#10 [ #1 + ] [ #1 - ] [ #2 + ] [ #3 + ] quad
|
||||
|
||||
~~~
|
||||
:quad (xqqqq-)
|
||||
'abcde 'abacadae reorder
|
||||
push push push push push push
|
||||
call pop pop call pop pop call
|
||||
pop pop call ;
|
||||
~~~
|
||||
|
||||
`quad*` takes eight values (!) and applies each quote to a specific value. E.g., these are equivilent:
|
||||
|
||||
#10 [ #1 + ] call
|
||||
#11 [ #1 - ] call
|
||||
#12 [ #2 + ] call
|
||||
#13 [ #3 + ] call
|
||||
|
||||
#10 #11 #12 #13 [ #1 + ] [ #1 - ] [ #2 + ] [ #3 + ] quad*
|
||||
|
||||
~~~
|
||||
:quad* (abcdqqqq-)
|
||||
'abcdefgh 'aebfcgdh reorder
|
||||
push push push push push push
|
||||
call pop pop call pop pop call
|
||||
pop pop call ;
|
||||
~~~
|
||||
|
||||
`quad@` takes four values and a quote, and applies the quote to each value in order. These are equivilent:
|
||||
|
||||
#10 [ #1 + ] call
|
||||
#11 [ #1 + ] call
|
||||
#12 [ #1 + ] call
|
||||
#13 [ #1 + ] call
|
||||
|
||||
#10 #11 #12 #13 [ #1 + ] quad@
|
||||
|
||||
~~~
|
||||
:quad@ (abcdq-)
|
||||
'abcde 'abcdeeee reorder quad* ;
|
||||
~~~
|
||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue