1 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; and now
for something completely different
...
3 ;; UrForth
/C Forth Engine
!
4 ;; Copyright
(C
) 2023 Ketmar Dark
// Invisible Vector
6 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 it is possible
to extend
"TO" for your own words
. there are two scattered
10 colon definitions for that.
12 ;; ( addr count FALSE
-- addr count FALSE
/ TRUE
)
13 : (TO-EXTENDER
) ... ; (HIDDEN
)
15 this will be called before
"TO" tried
to find a word
. if you processed
16 everything by yourself
, remove `addr` and `count`
, and
return TRUE
.
17 otherwise don
't touch anything.
19 ;; ( cfa FALSE -- cfa FALSE / TRUE )
20 : (TO-EXTENDER-FOUND) ... ; (HIDDEN)
22 this will be called after "TO" succesfully found a word.
25 please, note that you have to start your extensions with code like this:
31 i.e. don't
do anything
if some other extension already processed the
36 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39 : VALUE
( value
-- ) COMPILER
:(CFAIDX
-DO-VALUE
) COMPILER
:(MK
-CONST
-VAR
) ;
40 : VALUE?
( cfa
-- bool
) @ COMPILER
:(CFAIDX
-DO-VALUE
) = ;
41 : VALUE@
( cfa
-- value
) DUP VALUE?
" non-value CFA" ?NOT
-ERROR CFA
->PFA @
;
42 : VALUE
! ( value cfa
-- ) DUP VALUE?
" non-value CFA" ?NOT
-ERROR CFA
->PFA
! ;
44 : DEFER
( -- ) ['] NOOP COMPILER:(CFAIDX-DO-DEFER) COMPILER:(MK-CONST-VAR) ;
45 : DEFER? ( cfa -- bool ) @ COMPILER:(CFAIDX-DO-DEFER) = ;
46 : DEFER@ ( cfa -- value ) DUP DEFER? " non-defer CFA" ?NOT-ERROR CFA->PFA @ ;
47 : DEFER! ( value cfa -- ) DUP DEFER? " non-defer CFA" ?NOT-ERROR CFA->PFA ! ;
50 ;; called before trying to find a word
51 ;; ( addr count FALSE -- addr count FALSE / TRUE )
52 : (TO-EXTENDER) ... ; (HIDDEN)
54 ;; called after the word was found
55 ;; ( cfa FALSE -- cfa FALSE / TRUE )
56 : (TO-EXTENDER-FOUND) ... ; (HIDDEN)
59 : (TO-DEFER) ( n cfa -- ) CFA->PFA ! ; (HIDDEN)
60 ALIAS FORTH:(TO-DEFER) (TO-VALUE)
63 ..: (TO-EXTENDER-FOUND) ( cfa FALSE -- cfa FALSE / TRUE )
66 STATE @ IF CFALITERAL COMPILE FORTH:(TO-VALUE)
76 ..: (TO-EXTENDER-FOUND) ( cfa FALSE -- cfa FALSE / TRUE )
79 STATE @ IF CFALITERAL COMPILE FORTH:(TO-DEFER)
90 PARSE-SKIP-COMMENTS PARSE-NAME DUP " word name expected" ?NOT-ERROR
93 2DUP FIND-WORD ( addr count cfa TRUE / addr count FALSE )
95 ENDCR SPACE TYPE ." ? -- wut?\n" " word not found" ERROR
97 FALSE (TO-EXTENDER-FOUND) " trying to use 'TO' with something strange" ?NOT-ERROR
102 : (TO-READ) ( -- val ) \ name
104 >IN @ >R -FIND-REQUIRED
105 STATE @ IF COMPILE, ELSE EXECUTE ENDIF
111 STATE @ IF COMPILE SWAP COMPILE - ELSE SWAP - ENDIF
117 STATE @ IF COMPILE + ELSE + ENDIF
122 1 LITERAL [COMPILE] +TO
126 -1 LITERAL [COMPILE] +TO
130 0 STATE @ IF LITERAL ENDIF
136 : IS ( defer-cfa -- ) \ name
137 STATE @ IF [COMPILE] ['] COMPILE DEFER
!
142 : ACTION-OF ( -- cfa ) \ name
143 STATE @ IF [COMPILE] ['] COMPILE DEFER@
149 \ .( +++ test VALUEs +++\n)
155 \ : vtxc 69 TO vtest ;
156 \ DEBUG:DECOMPILE vtxc