|
|
1.1 root 1: \ tag: forth interpreter
2: \
3: \ Copyright (C) 2003 Stefan Reinauer
4: \
5: \ See the file "COPYING" for further information about
6: \ the copyright and warranty status of this work.
7: \
8:
9:
10: \
11: \ 7.3.4.6 Display pause
12: \
13:
14: 0 value interactive?
15: 0 value terminate?
16:
17: : exit?
18: interactive? 0= if
19: false exit
20: then
21: false \ FIXME we should check whether to interrupt output
22: \ and ask the user how to proceed.
23: ;
24:
25:
26: \
27: \ 7.3.9.1 Defining words
28: \
29:
30: : forget
31: s" This word is obsolescent." type cr
32: ['] ' execute
33: cell - dup
34: @ dup
35: last ! latest !
36: here!
37: ;
38:
39: \
40: \ 7.3.9.2.4 Miscellaneous dictionary
41: \
42:
43: \ interpreter. This word checks whether the interpreted word
44: \ is a word in dictionary or a number. It honours compile mode
45: \ and immediate/compile-only words.
46:
47: : interpret
48: 0 >in !
49: begin
50: parse-word dup 0> \ was there a word at all?
51: while
52: $find
53: if
54: dup flags? 0<> state @ 0= or if
55: execute
56: else
57: , \ compile mode && !immediate
58: then
59: else \ word is not known. maybe it's a number
60: 2dup $number
61: if
62: span @ >in ! \ if we encountered an error, don't continue parsing
63: type 3a emit
64: -13 throw
65: else
66: -rot 2drop 1 handle-lit
67: then
68: then
69: depth 200 >= if -3 throw then
70: depth 0< if -4 throw then
71: rdepth 200 >= if -5 throw then
72: rdepth 0< if -6 throw then
73: repeat
74: 2drop
75: ;
76:
77: : refill ( -- )
78: ib #ib @ expect 0 >in ! ;
79:
80: : print-status ( exception -- )
81: space
82: ?dup if
83: dup sys-debug \ system debug hook
84: case
85: -1 of s" Aborted." type endof
86: -2 of s" Aborted." type endof
87: -3 of s" Stack Overflow." type 0 depth! endof
88: -4 of s" Stack Underflow." type 0 depth! endof
89: -5 of s" Return Stack Overflow." type endof
90: -6 of s" Return Stack Underflow." type endof
91: -13 of s" undefined word." type endof
92: -15 of s" out of memory." type endof
93: -21 of s" undefined method." type endof
94: -22 of s" no such device." type endof
95: dup s" Exception #" type .
96: 0 state !
97: endcase
98: else
99: state @ 0= if
100: s" ok"
101: else
102: s" compiled"
103: then
104: type
105: then
106: cr
107: ;
108:
109: defer status
110: ['] noop ['] status (to)
111:
112: : print-prompt
113: status
114: depth . 3e emit space
115: ;
116:
117: defer outer-interpreter
118: :noname
119: cr
120: begin
121: print-prompt
122: source 0 fill \ clean input buffer
123: refill
124:
125: ['] interpret catch print-status
126: terminate?
127: until
128: ; ['] outer-interpreter (to)
129:
130: \
131: \ 7.3.8.5 Other control flow commands
132: \
133:
134: : save-source ( -- )
135: r> \ fetch our caller
136: ib >r #ib @ >r \ save current input buffer
137: source-id >r \ and all variables
138: span @ >r \ associated with it.
139: >in @ >r
140: >r \ move back our caller
141: ;
142:
143: : restore-source ( -- )
144: r>
145: r> >in !
146: r> span !
147: r> ['] source-id (to)
148: r> #ib !
149: r> ['] ib (to)
150: >r
151: ;
152:
153: : (evaluate) ( str len -- ??? )
154: save-source
155: -1 ['] source-id (to)
156: dup
157: #ib ! span !
158: ['] ib (to)
159: interpret
160: restore-source
161: ;
162:
163: : evaluate ( str len -- ?? )
164: 2dup + -rot
165: over + over do
166: i c@ 0a = if
167: i over -
168: (evaluate)
169: i 1+
170: then
171: loop
172: swap over - (evaluate)
173: ;
174:
175: : eval evaluate ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.