1 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; and now
for something completely different
...
5 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 PARSE
-NAME DUP
" define name expected" ?NOT
-ERROR
11 PARSE
-SKIP
-LINE
-COMMENTS
12 TIB
-PEEKCH
" $DEFINE doesn't accept extra args yet" ?ERROR
18 PARSE
-NAME DUP
" define name expected" ?NOT
-ERROR
19 PARSE
-SKIP
-LINE
-COMMENTS
20 TIB
-PEEKCH
" $DEFINE doesn't accept extra args yet" ?ERROR
25 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26 ;; simple expression evaluator
30 ALSO
($CC
-EVAL
) DEFINITIONS
32 0 VALUE CURR
-WORD
-ADDR
35 0 VALUE ALLOW
-CONTINUATIONS
40 DEFER $CC
-EXPR
( doeval?
-- value
)
43 : CURR
-WORD
( -- addr count
) CURR
-WORD
-ADDR CURR
-WORD
-LEN
;
45 : ONE
-CHAR
-WORD
( -- )
46 (TIB
-IN
) TO CURR
-WORD
-ADDR
1 TO CURR
-WORD
-LEN TIB
-SKIPCH
49 ;; one or two same chars
50 : ONE
-TWO
-CHAR
-WORD
( -- )
51 (TIB
-IN
) TO CURR
-WORD
-ADDR
52 TIB
-GETCH TIB
-PEEKCH
= IF TIB
-SKIPCH
2 TO CURR
-WORD
-LEN
53 ELSE 1 TO CURR
-WORD
-LEN
57 : IS
-SPECIAL
-CHAR
( ch
-- bool
)
59 [CHAR
] ! OF TRUE ENDOF
60 [CHAR
] ( OF TRUE ENDOF
61 [CHAR
] \ OF TRUE ENDOF
62 [CHAR
] ) OF TRUE ENDOF
63 [CHAR
] ~ OF TRUE ENDOF
64 [CHAR
] & OF TRUE ENDOF
65 [CHAR
] | OF TRUE ENDOF
66 [CHAR
] ; OF TRUE ENDOF
71 : CC
-PARSE
-SPECIAL
( -- )
72 TIB
-PEEKCH DUP
[CHAR
] & = SWAP
[CHAR
] |
= OR
73 IF ONE
-TWO
-CHAR
-WORD
ELSE ONE
-CHAR
-WORD
ENDIF
77 (TIB
-IN
) TO CURR
-WORD
-ADDR
79 TIB
-PEEKCH DUP BL
> SWAP IS
-SPECIAL
-CHAR NOT AND
83 (TIB
-IN
) CURR
-WORD
-ADDR
- TO CURR
-WORD
-LEN
86 COMPILER:TRACE-ENTER-EXIT
87 ($CC
-TRACE
) TO COMPILER
:TRACE
-ENTER
-EXIT
92 0 OF
(TIB
-IN
) TO CURR
-WORD
-ADDR
0 TO CURR
-WORD
-LEN TRUE ENDOF
93 [CHAR
] ; OF ONE
-CHAR
-WORD PARSE
-SKIP
-LINE
0 TO CURR
-WORD
-LEN TRUE ENDOF
94 [CHAR
] \ OF
;; possible continuation
95 ALLOW
-CONTINUATIONS
IF
96 TIB
-SKIPCH PARSE
-SKIP
-BLANKS
97 TIB
-PEEKCH
" invalid continuation" ?ERROR
98 REFILL
-NOCROSS
" unexpected end of file" ?NOT
-ERROR
100 ELSE ONE
-CHAR
-WORD TRUE
103 BL
<=OF TIB
-SKIPCH FALSE ENDOF
105 IS
-SPECIAL
-CHAR
IF CC
-PARSE
-SPECIAL
ELSE CC
-PARSE
-ID
ENDIF
109 \
." |" CURR
-WORD XTYPE
." | -- " TIB
-PEEKCH XEMIT CR
112 TO COMPILER
:TRACE
-ENTER
-EXIT
114 ;; parse required argument in parens
115 : NEXT
-WORD
-ARG
( -- )
116 NEXT
-WORD CURR
-WORD
" (" STRING
:= " '(' expected" ?NOT
-ERROR
119 TIB
-PEEKCH DUP
34 = OVER
96 = OR SWAP
39 = OR
IF
121 TO CURR
-WORD
-LEN
TO CURR
-WORD
-ADDR
123 ;; parse up
to blank or
")"
125 (TIB
-IN
) TO CURR
-WORD
-ADDR
0 TO CURR
-WORD
-LEN
127 TIB
-PEEKCH DUP BL
<= SWAP
41 = OR
130 CURR
-WORD
-LEN
1+ TO CURR
-WORD
-LEN
133 \
." |" CURR
-WORD XTYPE
." | -- " TIB
-PEEKCH XEMIT CR
134 CURR
-WORD
-LEN
1 = CURR
-WORD
-ADDR C@ IS
-SPECIAL
-CHAR AND
" identifier required" ?ERROR
135 CURR
-WORD
;; save address
137 NEXT
-WORD CURR
-WORD
" )" STRING
:= " ')' expected" ?NOT
-ERROR
139 TO CURR
-WORD
-LEN
TO CURR
-WORD
-ADDR
140 \
." ||" CURR
-WORD XTYPE
." | -- " TIB
-PEEKCH XEMIT CR
144 VOCABULARY
($CC
-EVAL
-TERMS
)
145 ALSO
($CC
-EVAL
-TERMS
) DEFINITIONS
148 NEXT
-WORD
-ARG CURR
-WORD FORTH
:($DEFINED?
)
149 ?DUP IFNOT
;; try without a leading dollar
150 CURR
-WORD
-LEN
2 > CURR
-WORD
-ADDR C@
[CHAR
] $
= AND
IF
151 CURR
-WORD
-ADDR
1+ CURR
-WORD
-LEN
1- FORTH
:($DEFINED?
)
156 : UNDEFINED
( -- val
) DEFINED NOT
;
157 : HAS
-WORD
( -- val
) NEXT
-WORD
-ARG CURR
-WORD FIND
-WORD
IF DROP TRUE
ELSE FALSE
ENDIF ;
158 : NO
-WORD
( -- val
) HAS
-WORD NOT
;
159 ALIAS UNDEFINED NOT
-DEFINED
164 COMPILER:TRACE-ENTER-EXIT
165 ($CC
-TRACE
) TO COMPILER
:TRACE
-ENTER
-EXIT
167 : $CC
-TERM
( -- value
)
168 \
." $TERM: " CURR
-WORD XTYPE CR
169 CURR
-WORD VOCID
: ($CC
-EVAL
-TERMS
) FALSE FIND
-WORD
-IN
-VOC
( cfa TRUE
/ FALSE
)
171 \
." $TERM: RES: " DUP
. CR
173 ;; special syntax
: $DEFVARNAME
174 CURR
-WORD
-LEN
2 > CURR
-WORD
-ADDR C@
36 = AND
IF
175 CURR
-WORD
-ADDR
1+ CURR
-WORD
-LEN
1- FORTH
:($DEFINED?
)
177 CURR
-WORD TRUE BASE @ FORTH
:(BASED
-NUMBER
) ( num TRUE
/ FALSE
)
178 IFNOT ENDCR SPACE CURR
-WORD XTYPE
." ? -- wut?!\n" " unknown term" ERROR
ENDIF
184 : $CC
-UNARY
( -- value
)
185 CURR
-WORD
" (" STRING
:= IF
187 CURR
-WORD
" )" STRING
:= " unbalanced parens" ?NOT
-ERROR
190 CURR
-WORD
" NOT" STRING
:=CI
191 CURR
-WORD
" !" STRING
:= OR
192 CURR
-WORD
" ~" STRING
:= OR
193 IF NEXT
-WORD RECURSE NOT
199 : $IS
-LOGAND
( -- bool
)
200 CURR
-WORD
" AND" STRING
:=CI
201 CURR
-WORD
" &&" STRING
:= OR
202 CURR
-WORD
" &" STRING
:= OR
205 : $IS
-LOGOR
( -- bool
)
206 CURR
-WORD
" OR" STRING
:=CI
207 CURR
-WORD
" ||" STRING
:= OR
208 CURR
-WORD
" |" STRING
:= OR
211 : ($CC
-LOG
-CREATE
) ( cfacheck cfalogop cfanext
-- value
)
213 ;; PFA
: cfanext cfacheck cfaop
214 -FIND
-REQUIRED
, ;; cfanext
215 -FIND
-REQUIRED
, ;; cfacheck
216 -FIND
-REQUIRED
, ;; cfaop
217 DOES
> ( pfa
-- value
)
222 NEXT
-WORD R@ @ EXECUTE
223 R@
2 +CELLS @ EXECUTE
228 ($CC
-LOG
-CREATE
) $CC
-AND $CC
-UNARY $IS
-LOGAND LOGAND
229 ($CC
-LOG
-CREATE
) $CC
-OR $CC
-AND $IS
-LOGOR LOGOR
232 ALLOW
-CONTINUATIONS
>R
233 1 TO ALLOW
-CONTINUATIONS $CC
-OR
234 R
> TO ALLOW
-CONTINUATIONS
237 ' ($CC-EXPR) TO $CC-EXPR
243 [CHAR] ; <> " invalid expression" ?ERROR
249 NEXT-WORD $CC-EXPR ENSURE-EOL
250 IF $IF-COUNT 1+ TO $IF-COUNT
251 ELSE TRUE $SKIP-CONDS
255 : ($SKIP-CONDS) ( toelse -- )
256 0 >R ( toelse | level )
258 REFILL-NOCROSS " unexpected end of file" ?NOT-ERROR
260 FALSE ( toelse done? | level )
261 CURR-WORD " $IF" STRING:=CI IF DROP R> 1+ >R FALSE ENDIF
262 CURR-WORD " $ENDIF" STRING:=CI IF DROP
263 ;; in nested ifs, look only for $ENDIF
266 ;; it doesn't matter which part we
're skipping, it ends here anyway
270 CURR-WORD " $ELSE" STRING:=CI IF DROP
271 ;; if we're skipping
"true" part
, go on
273 $
IF-COUNT
1+ TO $
IF-COUNT
276 ;; we
're skipping "false" part, there should be no else
277 " unexpected $ELSE" ERROR
282 CURR-WORD " $ELIF" STRING:=CI IF DROP
283 ;; if we're skipping
"true" part
, go on
285 ;; process the conditional
287 ;; either resume normal execution
, or keep searching
for $
ELSE
289 $
IF-COUNT
1+ TO $
IF-COUNT TRUE
293 ;; we
're skipping "false" part, there should be no else
294 " unexpected $ELIF" ERROR
299 DROP ;; drop `toelse`
300 R> 0<> " oops?" ?ERROR
301 REFILL " unexpected end of file" ?NOT-ERROR
304 ' ($SKIP
-CONDS
) TO $SKIP
-CONDS
306 TO COMPILER
:TRACE
-ENTER
-EXIT
312 ($CC
-EVAL
):$PROCESS
-COND
316 ($CC
-EVAL
):$
IF-COUNT
" unexpected $ELSE" ?NOT
-ERROR
317 ($CC
-EVAL
):ENSURE
-EOL
318 FALSE
($CC
-EVAL
):$SKIP
-CONDS
322 ($CC
-EVAL
):$
IF-COUNT
" unexpected $ELIF" ?NOT
-ERROR
323 ($CC
-EVAL
):$
IF-COUNT
1- TO ($CC
-EVAL
):$
IF-COUNT
324 FALSE
($CC
-EVAL
):$SKIP
-CONDS
328 ($CC
-EVAL
):$
IF-COUNT
" unexpected $ENDIF" ?NOT
-ERROR
329 ($CC
-EVAL
):ENSURE
-EOL
330 ($CC
-EVAL
):$
IF-COUNT
1- TO ($CC
-EVAL
):$
IF-COUNT
334 ALSO
($CC
-EVAL
):($CC
-EVAL
-TERMS
) DEFINITIONS
337 $
IF HAS
-WORD
(URASM
:HAS
-LABEL?
)
338 : HAS
-LABEL
( -- val
) NEXT
-WORD
-ARG CURR
-WORD URASM
:HAS
-LABEL?
;
339 : NO
-LABEL
( -- val
) HAS
-LABEL NOT
;
342 $
IF HAS
-WORD
(URASM
:PASS@
)
343 : PASS0
( -- val
) URASM
:PASS@
0= ;
344 : PASS1
( -- val
) URASM
:PASS@
0<> ;
349 PREVIOUS PREVIOUS DEFINITIONS