Working With Strings
Strings in RETRO are NULL terminated sequences of values
representing characters. Being NULL terminated, they can't
contain a NULL (ASCII 0).
The character words in RETRO are built around ASCII, but
strings can contain UTF8 encoded data if the host platform
allows. Words like s:length will return the number of bytes,
not the number of logical characters in this case.
Prefix
Strings begin with a single '.
'Hello
'This_is_a_string
'This_is_a_much_longer_string_12345_67890_!!!
RETRO will replace spaces with underscores. If you need both
spaces and underscores in a string, escape the underscores and
use s:format:
'This_has_spaces_and_under\_scored_words. s:format
Namespace
Words operating on strings are in the s: namespace.
Lifetime
At the interpreter, strings get allocated in a rotating buffer.
This is used by the words operating on strings, so if you need
to keep them around, use s:keep or s:copy to move them to
more permanent storage.
In a definition, the string is compiled inline and so is in
permanent memory.
You can manually manage the string lifetime by using s:keep
to place it into permanent memory or s:temp to copy it to
the rotating buffer.
Mutability
Strings are mutable. If you need to ensure that a string is
not altered, make a copy before operating on it or see the
individual glossary entries for notes on words that may do
this automatically.
Searching
RETRO provides four words for searching within a string.
• s:contains-char?
• s:contains-string?
• s:index-of
• s:index-of-string
Comparisons
• s:eq?
• s:case
Extraction
To obtain a new string containing the first n characters from
a source string, use s:left:
'Hello_World #5 s:left
To obtain a new string containing the last n characters from
a source string, use s:right:
'Hello_World #5 s:right
If you need to extract data from the middle of the string, use
s:substr. This takes a string, the offset of the first
character, and the number of characters to extract.
'Hello_World #3 #5 s:substr
Joining
You can use s:append or s:prepend to merge two strings.
'First 'Second s:append
'Second 'First s:prepend
Tokenization
• s:tokenize
• s:tokenize-on-string
• s:split
• s:split-on-string
Conversions
To convert the case of a string, RETRO provides s:to-lower
and s:to-upper.
s:to-number is provided to convert a string to an integer
value. This has a few limitations:
• only supports decimal
• non-numeric characters will result in incorrect values
Cleanup
RETRO provides a handful of words for cleaning up strings.
s:chop will remove the last character from a string. This
is done by replacing it with an ASCII:NULL.
s:trim removes leading and trailing whitespace from a string.
For more control, there is also s:trim-left and s:trim-right
which let you trim just the leading or trailing end as desired.
Combinators
• s:for-each
• s:filter
• s:map
Other
• s:evaluate
• s:copy
• s:reverse
• s:hash
• s:length
• s:replace
• s:format
• s:empty
Controlling The Temporary Buffers
As dicussed in the Lifetime subsection, temporary strings are
allocated in a rotating buffer. The details of this can be
altered by updating two variables.
| Variable | Holds |
| ------------- | ---------------------------------------- |
| TempStrings | The number of temporary strings |
| TempStringMax | The maximum length of a temporary string |
For example, to increase the number of temporary strings to
48:
#48 !TempStrings
The defaults are:
| Variable | Default |
| ------------- | ------- |
| TempStrings | 32 |
| TempStringMax | 512 |
It's also important to note that altering these will affect
the memory map for all temporary buffers. Do not use anything
already in the buffers after updating these or you will risk
data corruption and possible crashes.