Strings in Mops
String Types
There are three main ways of representing strings in Mops: as Str255
strings, as addr-len format strings, or as objects of class
String
or String+
.
When WORD
parses a string, it places at HERE (the next
available memory location above the dictionary : 68k) or
CDP
(the next available memory location above the code
area of dictionary, which is different from HERE
:
PowerPC) a byte representing the length of the string, followed by the
text of the string. This is the same representation as that used by the
Toolbox for the Str255 data type (see Inside
Macintosh).
When passing strings as parameters on the stack and manipulating them,
however, it is usually most convenient to use two cells to represent the
string as ( addr len \-- )
. The word
COUNT
accepts an address of a Str255-format string and
returns its ( addr len ) representation. Conversely, the word
STR255
converts addr len to Str255 format, returning
the address of the length byte to facilitate Toolbox calls.
Mops preserves a special 256-byte buffer expressly for conversion of
addr len to Str255 format, and this buffer's address is left on the
stack by the word BUF255
. You can use this area
occasionally as a temporary workspace for other operations, provided you
don't interfere with routine string processing. Note that the word
STR255
uses BUF255
, and so can only
work with one string at a time. For Toolbox calls that require multiple
strings, you will have to use the word >STR255
,
which accepts an arbitrary address for setup of the string.
String Literals and Constants
A Mops string literal is a quote followed by one space and the text of the string, immediately followed by another quote:
" Harold" \ leaves ( -- addr len ) of string
Thus, " Harold" TYPE
would print the word
Harold
on the screen. You should use the string literal
whenever you have a single occurrence of a string.
String constants (SCON
), on the other hand, are useful
when you need to use a string several times in your code. You assign a
name to the string, and then use the string name for operations with
that string, as follows:
scon harry "Harold" \ assign name harry to string
harry type \ prints "Harold" on the screen
Note that in this case you don't put a space between the " and the
first character of the string. In the first example,
"
was a word, and so had to have a space after it. In
the second example, "
isn't a word, but just a
character being read by the word SCON
. In fact you can
use any character as a delimiter, which is useful if you need to include
a "
within the string itself. The first nonblank
character after the name of the scon is the delimiter, and the string
consists of all the characters up till the next occurrence of the
delimiter. Thus you can have:
scon 3quotes /"""/
Using the name of the scon in your program leaves ( addr len )
on the stack, and compiles into a single xt of the dictionary
entry for the constant name. Both string literals and constants are
fixed strings that once defined, cannot be changed.
For heavily text-oriented applications, a more suitable approach would be to define the text strings as Resources (see section on Using Resources in Mops).
Other String Techniques
For string variables, use an object of classes String
or String+
, discussed in Part III of this manual. These
classes have many methods for doing the sorts of things that you might
want to do with strings, such as building them dynamically, finding
substrings, searching strings, and inserting and deleting characters
from within strings.
In the Tutorial we described the word & which compiles a single
literal ASCII character. This can be used either inside or outside a
definition. There are also the ANSI standard words CHAR
and \[CHAR\]
which perform this function. Outside a
definition, the phrase:
char A
places the ASCII code for 'A' (65) on the stack. Inside a definition, the phrase
[char] A
compiles a literal for 'A', and places the value on the stack at runtime. And as we've seen, you can use
& A
either inside or outside a definition, which is probably more convenient (although not ANSI).
There are several primitives for getting a string from the input stream
(either keyboard or disk) into the dictionary. WORD
gets the next word, without embedded blanks, and moves it to
HERE
, then returns that address.
\@WORD
is a useful word that takes the place of the
frequent phrase BL WORD
. For strings,
WORD"
reads a quote-delimited string from the input
stream, moves it to HERE
or CDP
, and
returns that address. MWORD
('Mops word') executes
BL WORD
, and maps the word to upper case. It is used by
Mops itself when interpreting or compiling.