Add hook mechanism for handling word not found

This commit is contained in:
2026-03-01 13:55:19 +00:00
parent 1ebe07b863
commit 9f1be9ad2f

View File

@@ -1119,13 +1119,13 @@
"\64\05\00\00"
"\04HERE\00\00\00"
"\02\00\00\00"
"\e0\0d\00\00")
"\30\0e\00\00")
(data (i32.const 0x058c)
"\78\05\00\00"
"\06LATEST\00"
"\02\00\00\00"
"\b4\0d\00\00")
"\e0\0d\00\00")
(data (i32.const 0x05a0)
"\8c\05\00\00"
@@ -1136,9 +1136,9 @@
(data (i32.const 0x05d0)
"\a0\05\00\00"
"\05ERROR\00\00"
"\02\00\00\00"
"\00\00\00\00")
"\07WNFHOOK"
"\01\00\00\00"
"\f0\0d\00\00")
;; And now, it's time for some hand-compiled colon words. It
;; probably would have made more sense to write most of these
@@ -1637,11 +1637,8 @@
;; LIT-CFA , , \ If compiling, append LIT and the value
;; EXIT
;;
;; \ Word was not found and also not a number. Ideally we'd print the
;; \ word that wasn't found here but I haven't implemented such things
;; \ yet so for now we'll just discard the word's length, set ERROR to
;; \ 1 and exit.
;; DROP 1 ERROR !
;; \ Word was not found
;; WNFHOOK EXECUTE
;; ;
(data (i32.const 0x0ac0)
@@ -1686,14 +1683,15 @@
"\5c\0a\00\00" ;; ,
"\5c\0a\00\00" ;; ,
"\0c\04\00\00" ;; EXIT
"\18\02\00\00" ;; DROP
"\18\04\00\00" ;; LIT
"\01\00\00\00" ;; 1
"\dc\05\00\00" ;; ERROR
"\c0\03\00\00" ;; !
"\dc\05\00\00" ;; WNFHOOK
"\bc\0b\00\00" ;; EXECUTE
"\0c\04\00\00") ;; EXIT
;; => 0xc4 bytes
;; => 0xb8 bytes
;; The previous version of INTERPRET was 0xc4 bytes, so we have 12
;; unused bytes here. Could fit an extra codeword definition in
;; here, if the name is less than 4 bytes long.
;; : QUIT R0 RSP! INTERPRET BRANCH [-8] ;
@@ -1928,7 +1926,7 @@
;; [
;; ; IMMEDIATE
(data (i32.const 0xdb4)
(data (i32.const 0x0db4)
"\78\0d\00\00"
"\81;\00\00"
"\00\00\00\00"
@@ -1943,6 +1941,34 @@
;; => 0x2c bytes
;; : WNF-HANDLER
;; DROP \ Discard word length
;; 87 EMIT 78 EMIT 70 EMIT 10 EMIT \ Print WNF
;; QUIT \ Reset return stack
;; ;
(data (i32.const 0x0de0)
"\b4\0d\00\00"
"\0bWNF-HANDLER"
"\00\00\00\00"
"\18\02\00\00" ;; DROP
"\18\04\00\00" ;; LIT
"\57\00\00\00" ;; 87
"\94\04\00\00" ;; EMIT
"\18\04\00\00" ;; LIT
"\4e\00\00\00" ;; 78
"\94\04\00\00" ;; EMIT
"\18\04\00\00" ;; LIT
"\46\00\00\00" ;; 70
"\94\04\00\00" ;; EMIT
"\18\04\00\00" ;; LIT
"\0a\00\00\00" ;; 10
"\94\04\00\00" ;; EMIT
"\90\0b\00\00" ;; QUIT
"\0c\04\00\00") ;; EXIT
;; => 0x50 bytes
;; The trampoline is a workaround for WebAssembly's lack of indirect
;; jumps and code addresses. Instead of jumping into the next
;; codeword, NEXT sets the $fn global to the function index of the