version 1.50, 2003/01/19 23:35:29
|
version 1.60, 2007/12/31 18:40:24
|
Line 1
|
Line 1
|
\ A powerful locals implementation |
\ A powerful locals implementation |
|
|
\ Copyright (C) 1995-2003 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2007 Free Software Foundation, Inc. |
|
|
\ This file is part of Gforth. |
\ This file is part of Gforth. |
|
|
\ Gforth is free software; you can redistribute it and/or |
\ Gforth is free software; you can redistribute it and/or |
\ modify it under the terms of the GNU General Public License |
\ modify it under the terms of the GNU General Public License |
\ as published by the Free Software Foundation; either version 2 |
\ as published by the Free Software Foundation, either version 3 |
\ of the License, or (at your option) any later version. |
\ of the License, or (at your option) any later version. |
|
|
\ This program is distributed in the hope that it will be useful, |
\ This program is distributed in the hope that it will be useful, |
Line 15
|
Line 15
|
\ GNU General Public License for more details. |
\ GNU General Public License for more details. |
|
|
\ You should have received a copy of the GNU General Public License |
\ You should have received a copy of the GNU General Public License |
\ along with this program; if not, write to the Free Software |
\ along with this program. If not, see http://www.gnu.org/licenses/. |
\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
|
|
|
|
\ More documentation can be found in the manual and in |
\ More documentation can be found in the manual and in |
Line 310 immediate
|
Line 309 immediate
|
immediate |
immediate |
|
|
forth definitions |
forth definitions |
|
also locals-types |
|
|
|
\ these "locals" are used for comparison in TO |
|
|
|
c: some-clocal 2drop |
|
d: some-dlocal 2drop |
|
f: some-flocal 2drop |
|
w: some-wlocal 2drop |
|
|
\ the following gymnastics are for declaring locals without type specifier. |
\ the following gymnastics are for declaring locals without type specifier. |
\ we exploit a feature of our dictionary: every wordlist |
\ we exploit a feature of our dictionary: every wordlist |
\ has it's own methods for finding words etc. |
\ has it's own methods for finding words etc. |
\ So we create a vocabulary new-locals, that creates a 'w:' local named x |
\ So we create a vocabulary new-locals, that creates a 'w:' local named x |
\ when it is asked if it contains x. |
\ when it is asked if it contains x. |
|
|
also locals-types |
|
|
|
: new-locals-find ( caddr u w -- nfa ) |
: new-locals-find ( caddr u w -- nfa ) |
\ this is the find method of the new-locals vocabulary |
\ this is the find method of the new-locals vocabulary |
\ make a new local with name caddr u; w is ignored |
\ make a new local with name caddr u; w is ignored |
Line 349 new-locals-map mappedwordlist Constant n
|
Line 354 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 360 variable old-dpp
|
Line 365 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 489 forth definitions
|
Line 494 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 637 forth definitions
|
2drop |
2drop |
endif ; |
endif ; |
|
|
: >definer ( xt -- definer ) |
: >definer ( xt -- definer ) \ gforth |
\G @var{Definer} is a unique identifier for the way the @var{xt} |
\G @var{Definer} is a unique identifier for the way the @var{xt} |
\G was defined. Words defined with different @code{does>}-codes |
\G was defined. Words defined with different @code{does>}-codes |
\G have different definers. The definer can be used for |
\G have different definers. The definer can be used for |
Line 644 forth definitions
|
Line 649 forth definitions
|
>code-address |
>code-address |
then ; |
then ; |
|
|
: definer! ( definer xt -- ) |
: definer! ( definer xt -- ) \ gforth |
\G The word represented by @var{xt} changes its behaviour to the |
\G The word represented by @var{xt} changes its behaviour to the |
\G behaviour associated with @var{definer}. |
\G behaviour associated with @var{definer}. |
over 1 and if |
over 1 and if |
Line 661 forth definitions
|
Line 666 forth definitions
|
-&32 throw |
-&32 throw |
endif ; |
endif ; |
:noname |
:noname |
0 0 0. 0.0e0 { c: clocal w: wlocal d: dlocal f: flocal } |
|
comp' drop dup >definer |
comp' drop dup >definer |
case |
case |
[ ' locals-wordlist ] literal >definer \ value |
[ ' locals-wordlist ] literal >definer \ value |
Line 669 forth definitions
|
Line 673 forth definitions
|
\ !! dependent on c: etc. being does>-defining words |
\ !! dependent on c: etc. being does>-defining words |
\ this works, because >definer uses >does-code in this case, |
\ this works, because >definer uses >does-code in this case, |
\ which produces a relocatable address |
\ which produces a relocatable address |
[ comp' clocal drop >definer ] literal |
[ comp' some-clocal drop ] literal >definer |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE c! ENDOF |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE c! ENDOF |
[ comp' wlocal drop >definer ] literal |
[ comp' some-wlocal drop ] literal >definer |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE ! ENDOF |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE ! ENDOF |
[ comp' dlocal drop >definer ] literal |
[ comp' some-dlocal drop ] literal >definer |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE 2! ENDOF |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE 2! ENDOF |
[ comp' flocal drop >definer ] literal |
[ comp' some-flocal drop ] literal >definer |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE f! ENDOF |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE f! ENDOF |
-&32 throw |
-&32 throw |
endcase ; |
endcase ; |
interpret/compile: TO ( c|w|d|r "name" -- ) \ core-ext,local |
interpret/compile: TO ( c|w|d|r "name" -- ) \ core-ext,local |
|
|
: locals| |
: locals| ( ... "name ..." -- ) \ local-ext locals-bar |
\ 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 |