As null terminated strings are used throughout C interfaces, their use is supported in Forth by way of several non-standard words with the convention of using Z/z to refer to such strings in names and stack comments.
Z" ( "string" -- z ) Creates a null terminated string on the heap Z>S ( z -- a n ) Convert a null terminated string to a counted string S>Z ( a n -- z ) Conver a counted string string to null terminated (copies string to heap)
Raw strings are provided better support using a string for the duration of the current command, without consuming heap memory.
R" ( "string" -- a n ) Creates a temporary counted string R| ( string| -- a n ) Creates a temporary counted string ending with |
DUMP ( a n -- ) Dump a memory region SEE ( "name" -- ) Attempt to decompile a word VARIABLE ECHO -- Determines if commands are echoed REMAINING ( -- n ) Bytes remaining in Forth heap. DUMP-FILE ( data data# fn fn# -- ) Write contents of a file throws on error.
{{FORTH}} uses a hybrid of Forth-79 and Forth-83 style vocabularies.
By default vocabularies chain to the vocabulary in which they were defined,
as in Forth-79. However, like Forth-83, ALSO
can be used to add vocabularies to a vocabulary stack of which
CONTEXT @ is the first item.
The word ONLY clears the vocabulary stack, but as there is
no separate ONLY vocabulary, it also sets CONTEXT
to the FORTH vocabulary.
The word SEALED modifies the most recently defined vocabulary
such that it does not chain. Note, this must be done before words are added to it.
VOCABULARY ( "name" ) Create a vocabulary with the current vocabulary as parent
FORTH ( -- ) Make the FORTH vocabulary the context vocabulary
DEFINITIONS ( -- ) Make the context vocabulary the current vocabulary
VLIST ( -- ) List the words in the context vocabulary (not chains)
WORDS ( -- ) List the words in the context vocabulary (including chains)
TRANSFER ( "name" ) Move a word from its current dictionary to the current vocabulary
Useful for "hiding" built-in words
TRANSFER{ ..words.. }TRANSFER ( -- ) Transfer multiple words to the current vocabulary
ALSO ( -- ) Duplicate the vocabulary at the top of the vocabulary stack
PREVIOUS ( -- ) Drop the vocabulary at the top of the vocabulary stack
ONLY ( -- ) Reset context stack to one item, the FORTH dictionary
Non-standard, as there's no distinct ONLY vocabulary
ORDER ( -- ) Print the vocabulary search order
SEALED ( -- ) Alter the last vocabulary defined so it doesn't chain
[IF], [ELSE], and [THEN] can be used
to selectively compile. Used in tandem with DEFINED? they can
be used to handle the absence of modules gracefully.
Nesting is supported.
DEFINED? ( "name" -- xt|0 ) Check if a word exists (works at compile time too). [IF] ( f -- ) Conditionally interpret the text the follows. [ELSE] ( -- ) Interpret time ELSE. [THEN] ( -- ) Interpret time THEN.
Requires v7.0.6.5+
Single precision floating-point support is available as a work in progress. While initially left out in the name of minimalism, hardware support for floating-point argues some advantages to limited support.
Floating point is kept on a separate stack.
NOTE: Tasks currently don't correctly support floating point. A single floating point stack is shared by all tasks.
FLOAT OPCODES ------------- DOFLIT ( --- ) Puts a float from the next cell onto float stack. FP@ ( -- a ) FP! ( a -- ) SF@ ( a -- r ) Single precision load SF! ( r a -- ) Single precision store FDUP ( r -- r r ) FNIP ( ra rb -- rb ) FDROP ( r -- ) FOVER ( ra rb -- ra rb ra ) FSWAP ( ra rb -- rb ra ) F0< ( r -- f ) F0= ( r -- f ) F+ ( r r -- r ) F- ( r r -- r ) F* ( r r -- r ) F/ ( r r -- r ) 1/F ( r -- r ) S>F ( n -- r ) F>S ( r -- n ) HIGH LEVEL ---------- F= ( r r -- f ) F< ( r r -- f ) F> ( r r -- f ) F<= ( r r -- f ) F>= ( r r -- f ) F<> ( r r -- f ) SFLOAT ( -- 4 ) SFLOATS ( n -- n*4 ) SFLOAT+ ( a -- a+4 ) SF, ( r -- ) AFLITERAL ( r -- ) FLITERAL ( r -- ) IMMEDIATE FCONSTANT ( r "name" ) FVARIABLE ( "name" ) PI ( -- r ) FSQRT ( r r -- r ) F.S ( -- ) Print float stack.
Locals allow named word local parameters and values.
Syntax:
{ local1 local2 .. -- comment }
or
{ local1 local2 .. }
Locals are ordered to match the stack, examples:
: 2OVER { a b c d } a b c d a b ;
: MAX { a b -- biggest } a b < IF b ELSE a THEN ;
( Equivalent with DO and FOR )
: POW2 { n } 1 { s } n FOR AFT s 2* to s THEN NEXT s ;
: POW2 { n } 1 { s } n 0 DO s 2* to s LOOP s ;
Capabilities and limitations:
>R R>) - NOT OK(LOCAL) is also supported.