# Dictionary searches
+TOCFA = defPrimWord(">CFA", () -> begin
+
+ addr = popPS()
+ lenAndFlags = mem[addr+1]
+ len = lenAndFlags & F_LENMASK
+
+ pushPS(addr + 2 + len)
+
+ return NEXT
+end)
+
+TOBODY = defWord(">BODY", [INCR, EXIT])
+
FIND = defPrimWord("FIND", () -> begin
countedAddr = popPS()
end
end
- pushPS(latest)
-
- return NEXT
-end)
-
-TOCFA = defPrimWord(">CFA", () -> begin
-
- addr = popPS()
- lenAndFlags = mem[addr+1]
- len = lenAndFlags & F_LENMASK
+ if latest > 0
+ pushPS(latest)
+ callPrim(mem[TOCFA])
+ if (lenAndFlags & F_IMMED) == F_IMMED
+ pushPS(1)
+ else
+ pushPS(-1)
+ end
+ else
+ pushPS(countedAddr)
+ pushPS(0)
+ end
- pushPS(addr + 2 + len)
return NEXT
end)
-TOPFA = defWord(">PFA", [TOCFA, INCR, EXIT])
# Branching
: TO IMMEDIATE ( n -- )
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') )
+ >CFA >BODY ( get a pointer to the first data field (the 'LIT') )
STATE @ IF ( compiling? )
['] LIT , ( compile LIT )
, ( compile the address of the value )
: +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') )
+ >CFA >BODY ( get a pointer to the first data field (the 'LIT') )
STATE @ IF ( compiling? )
['] LIT , ( compile LIT )
, ( compile the address of the value )
4 SPACES
- >PFA ( get the data address, ie. points after DOCOL | end-of-word start-of-data )
+ >CFA >BODY ( get the data address, ie. points after DOCOL | end-of-word start-of-data )
( now we start decompiling until we hit the end of the word )
BEGIN ( end start )