grt@twitch.UUCP (07/14/86)
> > which are not exactly "threaded". [...] An extreme case is to have the > > whole Forth as a huge 'case' statement in C. (Yes, I have seen something > > like that :-) ). > > How else can you implement threading if C is used as the implementation > language? (Or is that what the smiley is for?) In other languages the You do not need to use a switch. The threaded code is a list of pointers to words in the vocabulary. Each word includes a pointer to a function to be executed. The virtual machine fetches those pointers and dereferences to execute the functions. The dictionary area ought to be defined as an array of pointers to dictionary word headers, though I have cheated on the pointer types and used casts. The function for executing a definition is xqdef(pwd) struct w_list *pwd; /* location in dictionary where we are called */ { struct w_list *func; /* working d.p. for this function */ save_pc_on_a_stack; /* pc is dictionary pointer */ pc = (long*)wargs(pwd); /* get to first pointer in definition */ /* note that pc was called pointer to long (yeah, gross) */ do func = (struct w_list*)(*pc++); while ((*func->w_func)(func) != END); pop_pc_from_stack; return(DEF); } Here w_list is the dictionary header, pc is the dictionary pointer, and so func is a pointer to a header. In the header, w_func is a pointer to a function. Note that the function is passed the pointer to the place in the dictionary where it was called. This allows access to inline literal constants, nesting, and so on. The functions return int values. This function returns DEF. The last pointer in the compiled definition points to a function that returns END, which terminates the loop. I wrote a different dialect, but in standard Forth, ':' would cause the word to point to this function, while ';' would generate the pointer to the function returning END. All primitives are C functions in the instruction space, while the vocabulary is headers, pointers, literals, etc in the data space. I think it is impossible to do a Forth-like assembler because of the I/D separation; words must have a pointer to a function rather than being executed directly. -- George Tomasevich, ihnp4!twitch!grt AT&T Bell Laboratories, Holmdel, NJ