| : (local) ( addr u -- ) |
: (local) ( addr u -- ) |
| \ a little space-inefficient, but well deserved ;-) |
\ a little space-inefficient, but well deserved ;-) |
| \ In exchange, there are no restrictions whatsoever on using (local) |
\ In exchange, there are no restrictions whatsoever on using (local) |
| |
\ as long as you use it in a definition |
| dup |
dup |
| if |
if |
| nextname POSTPONE { [ also locals-types ] W: } [ previous ] |
nextname POSTPONE { [ also locals-types ] W: } [ previous ] |
| 2drop |
2drop |
| endif ; |
endif ; |
| |
|
| \ \ !! untested |
: >definer ( xt -- definer ) |
| \ : TO ( c|w|d|r "name" -- ) |
\ this gives a unique identifier for the way the xt was defined |
| \ \ !! state smart |
\ words defined with different does>-codes have different definers |
| \ 0 0 0. 0.0e0 { c: clocal w: wlocal d: dlocal f: flocal } |
\ the definer can be used for comparison and in definer! |
| \ ' dup >definer |
dup >code-address [ ' bits >code-address ] Literal = |
| \ state @ |
\ !! this definition will not work on some implementations for `bits' |
| \ if |
if \ if >code-address delivers the same value for all does>-def'd words |
| \ case |
>does-code 1 or \ bit 0 marks special treatment for does codes |
| \ [ ' locals-wordlist >definer ] literal \ value |
else |
| \ OF >body POSTPONE Aliteral POSTPONE ! ENDOF |
>code-address |
| \ [ ' clocal >definer ] literal |
then ; |
| \ OF POSTPONE laddr# >body @ lp-offset, POSTPONE c! ENDOF |
|
| \ [ ' wlocal >definer ] literal |
: definer! ( definer xt -- ) |
| \ OF POSTPONE laddr# >body @ lp-offset, POSTPONE ! ENDOF |
\ gives the word represented by xt the behaviour associated with definer |
| \ [ ' dlocal >definer ] literal |
over 1 and if |
| \ OF POSTPONE laddr# >body @ lp-offset, POSTPONE d! ENDOF |
does-code! |
| \ [ ' flocal >definer ] literal |
else |
| \ OF POSTPONE laddr# >body @ lp-offset, POSTPONE f! ENDOF |
code-address! |
| \ abort" can only store TO value or local value" |
then ; |
| \ endcase |
|
| \ else |
\ !! untested |
| \ [ ' locals-wordlist >definer ] literal = |
: TO ( c|w|d|r "name" -- ) |
| \ if |
\ !! state smart |
| \ >body ! |
0 0 0. 0.0e0 { c: clocal w: wlocal d: dlocal f: flocal } |
| \ else |
' dup >definer |
| \ abort" can only store TO value" |
state @ |
| \ endif |
if |
| \ endif ; |
case |
| |
[ ' locals-wordlist >definer ] literal \ value |
| |
OF >body POSTPONE Aliteral POSTPONE ! ENDOF |
| |
[ ' clocal >definer ] literal |
| |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE c! ENDOF |
| |
[ ' wlocal >definer ] literal |
| |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE ! ENDOF |
| |
[ ' dlocal >definer ] literal |
| |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE d! ENDOF |
| |
[ ' flocal >definer ] literal |
| |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE f! ENDOF |
| |
abort" can only store TO value or local value" |
| |
endcase |
| |
else |
| |
[ ' locals-wordlist >definer ] literal = |
| |
if |
| |
>body ! |
| |
else |
| |
abort" can only store TO value" |
| |
endif |
| |
endif ; immediate |
| |
|
| \ : locals| |
\ : locals| |
| \ !! should lie around somewhere |
\ !! should lie around somewhere |