--- gforth/glocals.fs 1995/10/16 18:33:10 1.14 +++ gforth/glocals.fs 1996/08/21 14:58:41 1.24 @@ -1,3 +1,27 @@ +\ A powerful locals implementation + +\ Copyright (C) 1995 Free Software Foundation, Inc. + +\ This file is part of Gforth. + +\ Gforth is free software; you can redistribute it and/or +\ modify it under the terms of the GNU General Public License +\ as published by the Free Software Foundation; either version 2 +\ of the License, or (at your option) any later version. + +\ This program is distributed in the hope that it will be useful, +\ but WITHOUT ANY WARRANTY; without even the implied warranty of +\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +\ GNU General Public License for more details. + +\ You should have received a copy of the GNU General Public License +\ along with this program; if not, write to the Free Software +\ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +\ More documentation can be found in the manual and in +\ http://www.complang.tuwien.ac.at/papers/ertl94l.ps.gz + \ Local variables are quite important for writing readable programs, but \ IMO (anton) they are the worst part of the standard. There they are very \ restricted and have an ugly interface. @@ -230,7 +254,8 @@ previous : new-locals-reveal ( -- ) true abort" this should not happen: new-locals-reveal" ; -create new-locals-map ' new-locals-find A, ' new-locals-reveal A, +create new-locals-map ( -- wordlist-map ) +' new-locals-find A, ' new-locals-reveal A, vocabulary new-locals new-locals-map ' new-locals >body cell+ A! \ !! use special access words @@ -464,7 +489,7 @@ forth definitions \ this gives a unique identifier for the way the xt was defined \ words defined with different does>-codes have different definers \ the definer can be used for comparison and in definer! - dup >code-address [ ' bits >code-address ] Literal = + dup >code-address [ ' spaces >code-address ] Literal = \ !! this definition will not work on some implementations for `bits' if \ if >code-address delivers the same value for all does>-def'd words >does-code 1 or \ bit 0 marks special treatment for does codes @@ -480,38 +505,34 @@ forth definitions code-address! then ; -\ !! untested -: TO ( c|w|d|r "name" -- ) \ core-ext,local -\ !! state smart - 0 0 0. 0.0e0 { c: clocal w: wlocal d: dlocal f: flocal } - ' dup >definer - state @ - if - 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 - -&32 throw - endcase - else - [ ' locals-wordlist >definer ] literal = - if - >body ! - else - -&32 throw - endif - endif ; immediate +:noname + ' dup >definer [ ' locals-wordlist >definer ] literal = + if + >body ! + else + -&32 throw + endif ; +:noname + 0 0 0. 0.0e0 { c: clocal w: wlocal d: dlocal f: flocal } + ' dup >definer + 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 2! ENDOF + [ ' flocal >definer ] literal + OF POSTPONE laddr# >body @ lp-offset, POSTPONE f! ENDOF + -&32 throw + endcase ; +interpret/compile: TO ( c|w|d|r "name" -- ) \ core-ext,local : locals| \ don't use 'locals|'! use '{'! A portable and free '{' - \ implementation is anslocals.fs + \ implementation is compat/anslocals.fs BEGIN name 2dup s" |" compare 0<> WHILE