version 1.3, 1994/06/17 12:35:03
|
version 1.4, 1994/07/08 15:00:43
|
Line 448 forth definitions
|
Line 448 forth definitions
|
: (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 ] |
Line 455 forth definitions
|
Line 456 forth definitions
|
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 |