version 1.46, 2000/09/23 15:46:56
|
version 1.53, 2003/03/22 10:04:07
|
Line 1
|
Line 1
|
\ A powerful locals implementation |
\ A powerful locals implementation |
|
|
\ Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc. |
|
|
\ This file is part of Gforth. |
\ This file is part of Gforth. |
|
|
Line 87
|
Line 87
|
|
|
require search.fs |
require search.fs |
require float.fs |
require float.fs |
|
require extend.fs \ for case |
|
|
: compile-@local ( n -- ) \ gforth compile-fetch-local |
: compile-@local ( n -- ) \ gforth compile-fetch-local |
case |
case |
Line 348 new-locals-map mappedwordlist Constant n
|
Line 349 new-locals-map mappedwordlist Constant n
|
variable old-dpp |
variable old-dpp |
|
|
\ and now, finally, the user interface words |
\ and now, finally, the user interface words |
: { ( -- lastxt wid 0 ) \ gforth open-brace |
: { ( -- latestxt wid 0 ) \ gforth open-brace |
dp old-dpp ! |
dp old-dpp ! |
locals-dp dpp ! |
locals-dp dpp ! |
lastxt get-current |
latestxt get-current |
get-order new-locals-wl swap 1+ set-order |
get-order new-locals-wl swap 1+ set-order |
also locals definitions locals-types |
also locals definitions locals-types |
0 TO locals-wordlist |
0 TO locals-wordlist |
Line 359 variable old-dpp
|
Line 360 variable old-dpp
|
|
|
locals-types definitions |
locals-types definitions |
|
|
: } ( lastxt wid 0 a-addr1 xt1 ... -- ) \ gforth close-brace |
: } ( latestxt wid 0 a-addr1 xt1 ... -- ) \ gforth close-brace |
\ ends locals definitions |
\ ends locals definitions |
] old-dpp @ dpp ! |
] old-dpp @ dpp ! |
begin |
begin |
Line 488 forth definitions
|
Line 489 forth definitions
|
: locals-:-hook ( sys -- sys addr xt n ) |
: locals-:-hook ( sys -- sys addr xt n ) |
\ addr is the nfa of the defined word, xt its xt |
\ addr is the nfa of the defined word, xt its xt |
DEFERS :-hook |
DEFERS :-hook |
last @ lastcfa @ |
latest latestxt |
clear-leave-stack |
clear-leave-stack |
0 locals-size ! |
0 locals-size ! |
locals-buffer locals-dp ! |
locals-buffer locals-dp ! |
Line 632 forth definitions
|
Line 633 forth definitions
|
endif ; |
endif ; |
|
|
: >definer ( xt -- definer ) |
: >definer ( xt -- definer ) |
\ this gives a unique identifier for the way the xt was defined |
\G @var{Definer} is a unique identifier for the way the @var{xt} |
\ words defined with different does>-codes have different definers |
\G was defined. Words defined with different @code{does>}-codes |
\ the definer can be used for comparison and in definer! |
\G have different definers. The definer can be used for |
|
\G comparison and in @code{definer!}. |
dup >does-code |
dup >does-code |
?dup-if |
?dup-if |
nip 1 or |
nip 1 or |
Line 643 forth definitions
|
Line 645 forth definitions
|
then ; |
then ; |
|
|
: definer! ( definer xt -- ) |
: definer! ( definer xt -- ) |
\ gives the word represented by xt the behaviour associated with definer |
\G The word represented by @var{xt} changes its behaviour to the |
|
\G behaviour associated with @var{definer}. |
over 1 and if |
over 1 and if |
swap [ 1 invert ] literal and does-code! |
swap [ 1 invert ] literal and does-code! |
else |
else |
Line 682 interpret/compile: TO ( c|w|d|r "name" -
|
Line 685 interpret/compile: TO ( c|w|d|r "name" -
|
\ don't use 'locals|'! use '{'! A portable and free '{' |
\ don't use 'locals|'! use '{'! A portable and free '{' |
\ implementation is compat/anslocals.fs |
\ implementation is compat/anslocals.fs |
BEGIN |
BEGIN |
name 2dup s" |" compare 0<> |
name 2dup s" |" str= 0= |
WHILE |
WHILE |
(local) |
(local) |
REPEAT |
REPEAT |