\ Interpretative Structuren 16feb92py
\ 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.
: dummy ; immediate
: >exec >r ; restrict ( :-)
: scanIF f83find dup 0= IF drop ['] dummy >name THEN ;
Create [struct]-search ' scanIF A, ' (reveal) A, ' drop A,
Create [struct]-voc NIL A, [struct]-search A,
NIL A, NIL A,
: ?if countif @ 0<
IF [ [struct]-voc 3 cells + ] ALiteral @ lookup ! THEN ;
UNLOCK Tlast @ NIL Tlast ! LOCK
\ last @ 0 last !
: [IF] 1 countif +! ?if ; immediate
: [THEN] -1 countif +! ?if ; immediate
: [ELSE] postpone [THEN] postpone [IF] ;
' [IF] Alias [IFDEF] immediate
' [IF] Alias [IFUNDEF] immediate
' [THEN] Alias [ENDIF] immediate
' [IF] Alias [BEGIN] immediate
' [IF] Alias [WHILE] immediate
' [THEN] Alias [UNTIL] immediate
' [THEN] Alias [AGAIN] immediate
' [IF] Alias [DO] immediate
' [IF] Alias [?DO] immediate
' [THEN] Alias [LOOP] immediate
' [THEN] Alias [+LOOP] immediate
: [REPEAT] postpone [AGAIN] postpone [THEN] ;
' ( Alias ( immediate
' \ Alias \ immediate
UNLOCK Tlast @ swap Tlast ! LOCK
\ last @ swap last !
1 cells - [struct]-voc !
\ Interpretative Structuren 30apr92py
: defined bl word find nip 0<> ; immediate
: [IF] 0= IF countif off
lookup @ [ [struct]-voc 3 cells + ] ALiteral !
[struct]-voc lookup !
THEN ; immediate
: [IFDEF] postpone defined postpone [IF] ; immediate
: [IFUNDEF] postpone defined 0= postpone [IF] ; immediate
: [ELSE] 0 postpone [IF] ; immediate
: [THEN] ; immediate
: [ENDIF] ; immediate
\ Structs for interpreter 28nov92py
: [DO] ( start end -- ) >in @ -rot
DO I (i) ! dup >r >in ! interpret r> swap +LOOP drop ;
: [?DO] 2dup = IF 2drop postpone [ELSE] ELSE postpone [DO] THEN ;
: [+LOOP] ( n -- ) rdrop rdrop ; immediate
: [LOOP] ( -- ) 1 rdrop rdrop ; immediate
: [FOR] ( n -- ) 0 swap postpone [DO] ; immediate
: [NEXT] ( n -- ) -1 rdrop rdrop ; immediate
: [I] ( -- index ) (I) @ postpone Literal ; immediate
: [BEGIN] >in @ >r BEGIN r@ >in ! interpret UNTIL rdrop ;
' [+LOOP] Alias [UNTIL] immediate
: [REPEAT] ( -- ) false rdrop rdrop ; immediate
' [REPEAT] Alias [AGAIN] immediate
: [WHILE] ( flag -- )
0= IF postpone [ELSE] true rdrop rdrop 1 countif +! THEN ;