+ ['] LIT , ( compile LIT )
+ , ( compile the address of the value )
+ ['] ! , ( compile ! )
+ ELSE ( immediate mode )
+ ! ( update it straightaway )
+ THEN
+;
+
+( x +TO VAL adds x to VAL )
+: +TO IMMEDIATE
+ BL WORD ( get the name of the value )
+ FIND ( look it up in the dictionary )
+ >PFA ( get a pointer to the first data field (the 'LIT') )
+ STATE @ IF ( compiling? )
+ ['] LIT , ( compile LIT )
+ , ( compile the address of the value )
+ ['] +! , ( compile +! )
+ ELSE ( immediate mode )
+ +! ( update it straightaway )
+ THEN
+;
+
+( Fill u ints, starting at a, with the value b )
+: FILL ( a u b -- )
+ -ROT OVER + SWAP ?DO
+ DUP I !
+ LOOP
+ DROP
+;
+
+: ERASE ( a u -- )
+ 0 FILL
+;
+
+( PRINTING THE DICTIONARY ------------------------------------------------------ )
+
+: ID.
+ 1+ ( skip over the link pointer )
+ DUP @ ( get the flags/length byte )
+ F_LENMASK AND ( mask out the flags - just want the length )
+
+ BEGIN
+ DUP 0> ( length > 0? )
+ WHILE
+ SWAP 1+ ( addr len -- len addr+1 )
+ DUP @ ( len addr -- len addr char | get the next character)
+ DUP 32 >= OVER 127 <= AND IF
+ EMIT ( len addr char -- len addr | and print it)
+ ELSE
+ BASE @ SWAP HEX
+ ." \x" 0 .R
+ BASE !
+ THEN
+ SWAP 1- ( len addr -- addr len-1 | subtract one from length )
+ REPEAT
+ 2DROP ( len addr -- )
+;
+
+: ?HIDDEN
+ 1+ ( skip over the link pointer )
+ @ ( get the flags/length byte )
+ F_HIDDEN AND ( mask the F_HIDDEN flag and return it (as a truth value) )
+;
+: ?IMMEDIATE
+ 1+ ( skip over the link pointer )
+ @ ( get the flags/length byte )
+ F_IMMED AND ( mask the F_IMMED flag and return it (as a truth value) )
+;
+
+: WORDS
+ LATEST @ ( start at LATEST dictionary entry )
+ BEGIN
+ ?DUP ( while link pointer is not null )
+ WHILE
+ DUP ?HIDDEN NOT IF ( ignore hidden words )
+ DUP ID. ( but if not hidden, print the word )
+ SPACE
+ THEN
+ @ ( dereference the link pointer - go to previous word )
+ REPEAT
+ CR
+;
+
+
+( FORGET ---------------------------------------------------------------------- )
+
+: FORGET
+ BL WORD FIND ( find the word, gets the dictionary entry address )
+ DUP @ LATEST ! ( set LATEST to point to the previous word )
+ H ! ( and store H with the dictionary address )
+;
+
+( DUMP ------------------------------------------------------------------------ )
+
+\ TODO!
+
+
+( DECOMPILER ------------------------------------------------------------------ )
+
+: CFA>
+ LATEST @ ( start at LATEST dictionary entry )
+ BEGIN
+ ?DUP ( while link pointer is not null )
+ WHILE
+ 2DUP SWAP ( cfa curr curr cfa )
+ < IF ( current dictionary entry < cfa? )
+ NIP ( leave curr dictionary entry on the stack )
+ EXIT
+ THEN
+ @ ( follow link pointer back )
+ REPEAT
+ DROP ( restore stack )
+ 0 ( sorry, nothing found )
+;
+
+: SEE
+ BL WORD DUP FIND ( find the dictionary entry to decompile )
+
+ ?DUP 0= IF
+ ." Word '" COUNT TYPE ." ' not found in dictionary."
+ EXIT