The C implementation of Retro provides several functions for interacting with code written in Retro.

Dictionary

The dictionary is a linked list, with a pointer to the most recent entry stored in address 2.

You can access the fields for each entry using:

d_link d_xt d_class d_name

Each takes a dictionary header address (the "dictionary token") and returns a pointer to the Retro address for the desired data.

To find a dictionary token, use d_lookup. This takes the address of the dictionary to search (memory[2] in most cases) and the name of the word to find.

There is also d_xt_for() which takes a name and a dictionary pointer and returns the execution token for the specified word.

Strings

Like C, Retro uses NUL terminated strings. But, since all addressing is 32-bit (or 64-bit, depending on your configuration), some conversion is needed.

To get a C version of a string, use string_extract(). This takes a Retro address and returns a pointer to a C string.

Example:

// Get the name of the most recently defined word string_extract(d_name(memory[2]));

To push a C string into Retro memory, use string_inject(). This takes a C string and a Retro address.

// Copy a string to the TIB buffer string_inject("hello", 1024);

Stack

You can push values to the stack with stack_push() and pop them off with stack_pop().

Interacting

If you have a word named hello that you wish to run:

execute(d_xt_for("hello", memory[2]));

If you want to evaluate a token as if it was typed into a Retro listener:

string_inject("token", 1024); stack_push(1024); execute("interpret", memory[2]);

The interpret word handles things like sigils, so this is needed if you want to run something that needs those.