/
AnsforthLocals
52 lines (44 loc) · 1.28 KB
/
AnsforthLocals
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
\ This implements a subset of the gforth locals syntax in pure ANS Forth
\ From compat.zip distributed with gforth, probably by Anton Ertl.
\ This file is in the public domain. NO WARRANTY.
\ This implementation technique has been described by John Hayes in
\ the SigForth Newsletter 4(2), Fall '92. He did not do the complete
\ job, but left some more mundane parts as an exercise to the reader.
\ I don't implement the "|" part, because 1) gforth does not implement
\ it and 2) it's unnecessary; just put a 0 before the "{" for every
\ additional local you want to declare.
\ The program uses the following words
\ from CORE :
\ : bl word count ; >in @ 2dup 0= IF 2drop [char] ELSE THEN drop
\ recurse swap ! immediate
\ from CORE-EXT :
\ parse true
\ from BLOCK-EXT :
\ \
\ from FILE :
\ ( S"
\ from LOCAL :
\ (local)
\ from STRING :
\ compare
: local ( "name" -- )
bl word count (local) ;
: {helper ( -- final-offset )
>in @
bl word count
2dup s" --" compare 0= if
2drop [char] } parse 2drop true
else
s" }" compare 0=
then
if
drop >in @
else
recurse
swap >in ! local
then ;
: { ( -- )
{helper >in ! 0 0 (local) ; immediate
\ : test-swap { a b -- b a } ." xxx"
\ b a ;
\ 1 2 test-swap . . .s cr