-
Notifications
You must be signed in to change notification settings - Fork 1
/
MANUAL.TXT
1584 lines (996 loc) · 56 KB
/
MANUAL.TXT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
The Archetype Language Reference Manual
by
Derek T. Jones
Overview
An Archetype program consists of a series of object declarations.
These declarations can be simplified by defining "types" so that
the common attributes of several slightly different objects can
be described once; this is known as "inheritance" in object-
oriented parlance.
Objects consist of changeable attributes, which describe an
object's properties, and methods, which describe the object's
behavior and how it depends on its own attributes and its
interaction with other objects. Methods are tied to messages;
when the object receives that message, the method associated with
it is invoked.
Methods consist of one or more statements tied to a message. To
"invoke" a method means to execute its statements in order from
top to bottom. Some statements have a value; the value of the
last statement to be executed is returned to the sender of the
message that invoked the method.
Archetype programs are executed by the PERFORM program after
being translated into an intermediate binary form by the CREATE
program. The PERFORM program contains a single object named
"system" which starts your program by sending the message 'START'
to an object named "main". For this reason every Archetype
program has to have one (and only one) object named "main" which
contains a method for the 'START' message.
Object Declarations
An object declaration has the following form:
<type-name> ( <object-name> | null )
( <attribute-name> : <initial-value> )*
[ methods
( <message> : <statement> )* ]
end
A typical object declaration:
room bare_cell
desc : "bleak, bare cell"
methods
'look' : write "I'm standing in a ", desc, "."
'north' : hallway
end
In the above example, the type "room" had already been defined.
A type must be defined before it is used by an object. The only
type that is already defined for you is the "null" type. The
"null" type means that the only attributes and methods that the
object contains are what appears in its particular declaration.
Whenever an object is declared to be of a certain type, that
object inherits the attributes and methods declared in the
definition of the type.
Please NOTE that when an attribute has a default expression, as
above, the attribute contains the unevaluated form of the
expression. This is in contrast to what happens when the
attribute is assigned a new value at run-time with the :=
operator (see Operators and Expressions below). What this means
is that in an object declaration such as:
null abc
a : 3
def : a + 5
end
the value of the attribute "def" will change if the value of
attribute "a" changes.
When an object inherits an attribute or method, it means that
unless that object specifically redefines that attribute or
method, it will have the attribute or method defined by the type.
Look at the example below:
type shouter based on null
name : "an unremarkable shouting object"
methods
'shout' : >>Shout, Shout, Ready Or Not!
'who are you' :
write "I am ", name, "."
end
shouter Bob
name : "Bob"
end
The object Bob did not declare the method 'shout' or the method
'who are you', but inherited them from the "shouter" declaration
because it is a "shouter" type. It did not inherit the "name"
attribute because it had its own specific declaration for that.
The code above could be replaced by the single declaration below:
null Bob
name : "Bob"
methods
'shout' : >>Shout, Shout, Ready Or Not!
'who are you' :
write "I am ", name, "."
end
For a single object, the code above seems smaller and simpler,
and perhaps it is. But if you had even two "shouter" objects,
using a common type definition saves you time, makes the code
clearer, and actually uses less memory while being executed.
Type definitions can inherit attributes and methods from other
type definitions. In the above example, type "shouter" was based
on "null", meaning that there was no inheritance. But we could
define a type "screamer" based on "shouter":
type screamer based on shouter
IsAscreamer : TRUE
methods
'scream' : >>I CAN SCREAM TOO!
end
Now if we make an object of that type:
screamer Joe
name : "Joe"
methods
'sing' : >>Tra la la!
end
it is the same as if we had declared Joe as:
null Joe
IsAscreamer : TRUE
name : "Joe"
methods
'sing' : >>Tra la la!
'scream' : >>I CAN SCREAM TOO!
'shout' : >>Shout, Shout, Ready Or Not!
'who are you' :
write "I am ", name, "."
end
The object "Joe" inherits attributes and methods first from the
"screamer" type, and then, because "screamer" is based on
"shouter", from the "shouter" type.
The trick of the "IsAscreamer" attribute is a common one in
Archetype. If every type declares an attribute named
IsA<type-name>, it is easy to tell whether an object's particular
"family tree" has that type in it:
if any_object.IsAshouter then
write any_object.desc, " is a shouter."
Statements
An Archetype method is a single statement. However, this
statement can be compound, that is, made up of several statements
inside curly braces { } . For example:
null obj
methods
'ex1' : write "This is a single statement."
'ex2' : {
write "This is still a single statement because"
write "both these statements are inside curly braces."
}
'ex3' :
write "Although this might look like a compound statement,"
write "it is not; this line and the next will be flagged"
write "as errors by the CREATE program."
end
The 'ex3' method is only tied to the first statement. The next
two statements are "stranded" and will prevent the program from
being compiled into an executable form.
Reference To Archtype Statements
How To Read This Manual: Each statement is preceded by a single
line followed by its complete syntax in Backus-Naur form. If you
are not familiar with Backus-Naur form, read Appendix A.
include "filename"
This is probably the first Archetype statement you will use, in
order to include STANDARD.ACH. The filename must be a string
literal enclosed in double quotes. You can put a pathname on the
include file if you like. The compiler will first search the
current directory for the file and then the directory in which
the compiler is located. All of the text in the file is compiled
as though you had included it there with your editor.
( write | writes | stop ) [ <expression> (, <expression> )* ]
The write, writes, and stop statements all take zero or more
comma-separated expressions and write them to the screen. The
write statement finishes off the line after writing its
expressions. The writes statement keeps the line "dangling" so
that subsequent output appears on the same line. The stop
statement halts the Archetype program after writing its output
and returns to DOS.
All Archetype output is word-wrapped and "paged". No words will
be split across the right margin, and text will not flow off the
top of the screen before the user can read it all. After 23
lines of text, a "Hit any key to continue" message is displayed
and the rest of the text is shown after the key is hit. In other
words, all text output is "civilized" without the programmer
having to program specifically for it.
Examples:
drinkable poison
desc : "golden goblet"
filled : TRUE
methods
'look' : {
writes "I look inside the ", desc, " and see "
if filled then
write "A frothing, noxious potion!"
else
write "nothing."
}
'drink' :
if filled then
stop "I drink it down... Garg! I die in agony."
else
write "The ", desc, " is empty."
end
object manual
desc : "programmer's manual"
location : desk
methods
'look' : write "As I look at the manual, I see that it has ",
"a useful tip on the use of a single write ",
"statement to make a block of free-flowing text ",
"that is guaranteed to wrap correctly: using a ",
"series of comma-separated strings."
end
Returns: The write statements always return the value of the
last <expression> they write.
if <expression> then <statement> [ else <statement> ]
The if statement is extremely important because it is one of the
only ways of modifying an object's behavior based on any of its
attributes. <expression> is evaluated; if it is UNDEFINED,
ABSENT, or FALSE, the statement following else is executed;
otherwise the statment following then is executed. If
<expression> is UNDEFINED, ABSENT, or FALSE and there is no else
branch in the if statement, nothing happens. There must always
be a then branch. The <statement> following then or else can be
another if statement. One thing to be careful of when having
another if statement follow a then is that the next else
encountered will be considered a part of the most recent then.
If this is not what you want, use curly braces to surround the
inner if statement.
Examples:
object airlock
open : TRUE
locked : TRUE
methods
'leave' :
if not spacesuit.wearing then
stop "I'm not wearing a spacesuit! I die."
else if not spacesuit.patched then
stop "All the air escapes through the hole in the suit!"
else if not helmet.wearing then
stop "I'm not wearing a helmet! I die."
else {
write "I step out of the airlock."
message --> object
}
end
Returns: The if expression returns the value of the last
executed <statement>. If there is no else branch, and
<expression> is UNDEFINED, ABSENT, or FALSE, then the
value of the if statement is UNDEFINED.
case <test expression> of {
( <expression> : <statement> )* [ default : <statement> ] }
The case statement is a way of checking an expression to see if
it matches one of several values. <test expression> is evaluated
only once. Then the <expression> : <statement> pairs following
the word of and a curly brace are evaluated from first to last
until one of the <expression>s matches <test expression>. If
this happens, the <statement> following the colon is executed.
The word default matches any <test expression> and therefore must
be at the end of the case statement. The case statment usually
replaces a more complicated if-then-else-if... structure.
Example:
Instead of
{ tries +:= 1
if tries = 1 then
write "I try to open it with my bare hands, but I can't."
else if tries = 2 then
write "I try and try but it stays closed."
else if tries = 3 then
write "I scream with frustration, but the can won't open."
else if tries = 4 then
write "I pound the can upon the pavement. Stays shut."
else
write "No. I've given up." }
you can write
case tries +:= 1 of {
1 : write "I try to open it with my bare hands, but I can't."
2 : write "I try and try but it stays closed."
3 : write "I scream with frustration, but the can ",
"won't open."
4 : write "I pound the can upon the pavement. Stays shut."
default : write "No. I've given up."
}
while <expression> do <statement>
The while statement is the most straightforward way to do
something repeatedly. <expression> is evaluated; if it is
UNDEFINED, ABSENT, or FALSE, the while statment ends. If not,
<statement> is executed and <expression> is evaluated again.
There are two ways to stop a while loop: <statement> must
eventually cause <expression> to evaluate to UNDEFINED, ABSENT,
or FALSE, or <statement> must contain the break statment.
Note that if <expression> is UNDEFINED, ABSENT, or FALSE before
entering the while loop, <statement> will never be evaluated.
Examples:
{ # sums up the numbers between 1 and x
while x > 0 do {
sum +:= x
x -:= 1
}
write "The sum is ", sum
}
# interactive questioning
while TRUE do {
writes "What message would you like to send? "
if (m := read) == "quit" then
break
else
m -> obj
}
Note that in the above example, the only way the loop can exit is
with the break statement, since <expression> will always be TRUE.
for <expression> do <statement>
The for statement is the other way of doing things repeatedly.
It is used when you want to do some action to all or some set of
the objects in your program.
<expression> should contain the keyword each. This keyword is
set, in turn, to each object in your program. Every time
<expression> does not evaluate to UNDEFINED, ABSENT, or FALSE,
<statement> is executed. <statement> will usually contain the
keyword each as well, which retains its value until <expression>
is evaluated again.
Examples:
object purse
methods
'empty' : {
write "I empty out the purse and find:"
for each.location = purse do {
write each.desc
each.location = player.location; 'MOVE' -> each
}
}
end
If you want <statement> to apply to every single object in your
program, not just those that satisfy some <expression>, write
for each do ...
Note that even if <expression> only specifies a few objects out
of the hundred or so in your program, all of the program's
objects must be tested. For this reason the for statement can
take longer that it seems it should, especially for a large
program.
If you want to find just the first instance of the set of objects
you're looking for, you can use the break statement to jump out
the instant <statement> is evaluated:
# player needs a container in their possession
{
useful := UNDEFINED
for each.IsAcontainer and each.location = player do {
useful := each
break
}
if useful then
write "You can use ", useful.desc, "."
else
write "You don't have anything useful."
}
create <type name> named <attribute>
Most of the objects in your program will probably be defined
within the program themselves. However, there are some
situations where you would like to add an object to your program
dynamically, that is, after the program is already underway. The
create statement is the way to do this. This statement
instantiates an object of <type name> and causes <attribute> to
point to it. <attribute> is said to reference the new object.
The new object will not have its own name; it is actually a
nameless object. If you assign some other value to <attribute>,
without keeping track of the new object some other way, it will
be hard to find again. (The for statement will pick it up,
however.) Here is one application of the create statement. The
following types define a list. The nodes act like "coathangers";
the senders of the 'Attach Me' messages are pointed to by the
nodes, which in turn point to the next node down the list. In
order for this to work, the nodes have to be created as they are
needed.
type node based on null
next : UNDEFINED
refer : UNDEFINED
end
type list based on null
head : UNDEFINED
temp : UNDEFINED
methods
'Attach Me' : {
create node named temp
temp.refer := sender
temp.next := head
head := temp
}
'Display List' : {
temp := head
while temp do {
'Display Self' -> temp.refer
temp := temp.next
}
}
end
Note that the example above assumes that the senders of the
'Attach Me' message have a 'Display Self' method which they can
respond to.
destroy <attribute>
This statement performs the opposite of the create statement. If
<attribute> is pointing to a dynamically instantiated object, the
object will be destroyed. Any other attributes which happen to
be referencing it will now evaluate to UNDEFINED. We can extend
the list type defined above by adding the following method to the
list type:
'Shrink List' : {
if head then {
temp := head
head := head.next
destroy temp
}
This method shrinks the list by one element by removing the top
element.
Keywords
Archetype has a number of keywords which cannot be used as
object, type, or attribute names because they evaluate to special
values depending on their context.
each UNDEFINED outside of a for loop. Within a for loop,
evaluates to each object in the program, starting with
the first one defined for the first iteration of the
loop and evaluating to the next one for the next
iteration, and so forth.
key Evaluates to a single keypress. When the program tries
to evaluate key, execution stops until the user presses
a single key. key will then evaluate to this
character.
message The last message received by the object. Most useful
in a default method, where you may not know at the time
of writing the program which message might be invoking
the method.
read Like key, except that program execution will be
suspended until the user terminates their input with a
RETURN. read will then evaluate to the entire line
that the user typed.
self Evaluates to the current object. Most useful in a type
definition, where you are trying to code for the
general case.
sender Evaluates to the sender of message. Since Archetype
does not support arguments, this is a method's only
link to any necessary data that the sender might have.
Operators and Expressions
There are exactly three forms of an expression, which can be
represented by the following BNF:
<expression> :== ( <value> |
( <expression> <binary operator> <expression>
) | ( <unary operator> <expression> ) )
The operators following are discussed in rough order of their
importance and significance.
Assignment ( :=, +:=, -:=, *:=, /:=, &:= )
The assignment operator always has the form <attribute> :=
<expression>. If the left side does not evaluate to an existing
attribute, a warning will be given. If it does, then the value
of <expression> is placed into <attribute>. The former value of
<attribute> is destroyed.
The assignment operator has several cumulative forms: +:=, -:=,
*:=, /:=, and &:= . These are all of the form <operator>:= , and
have the same effect as the statement <attribute> := <attribute>
<operator> <expression>, but are shorter and faster. In other
words, instead of
a := a + 1
write
a +:= 1
The value of the expression is always the final value of
<attribute>. Assignment operators group right to left, which is
unusual (most Archetype operators group left to right); this is
so that successive assignments can be made to the same value, so
that:
subj := dobj := verb := prep := UNDEFINED
will set all four attributes to UNDEFINED.
NOTE: it is important to remember that the attribute on the left
hand side of the assignment will receive the value of the
expression on the right, not its unevaluated form. What this
means is that a statement such as
abc := main.dobj
will set the value of the attribute abc to the current value of
main.dobj. If main.dobj changes its value later, abc's value
will not change. This is in contrast to the practice of
initializing an attribute with an expression, as described above
in Object Declarations.
Sending Messages ( ->, --> )
These operators are always of the form <message> -> <object> or
<message> -> <type name>, and simply send <message> to <object>.
If <object> has a method defined for <message>, that method will
be invoked, and the value of the expression will be the value of
the last statement executed in the method. If <message> is not a
defined message, or <object> is not a defined object, the value
of the expression is UNDEFINED, and the message is never sent.
Note that the vocabulary of sendable messages is built from all
the single-quoted literals in your program. This simply means
that you should always put messages in single quotes.
If <message> and <object> are both valid, but <object> does not
have a method defined for <message>, the value of the send
expression is the word ABSENT. Note that this is not just a
system-generated message; an object can actually return ABSENT if
it wishes to inform the sender that it did not "handle" the
message. This is most commonly used if an object had defined a
default message, since the presence of such a method means that
the object automatically "handles" any message given it. For
example, the following default method handles direction messages,
but not any others:
default :
if message -> compass then
message -> handler
else
ABSENT
The pass (-->) operator invokes the appropriate method from
<object>, but executes the method within the context of the
current object, as though the current object were receiving the
message. This is always the functionality used whenever the
receiver is a <type name>, since types do not have attributes.
One common reason to pass a message to a type is when you are
defining an extension to an existing method in your type, and you
do not wish to type (or do not know) all the previous code. When
the player tries to drop the following object, there is first a
condition:
object superglue
location : drawer
desc : "super glue"
sticky : TRUE
methods
'drop' :
if location = player and sticky then
write "I can't! It's stuck to my fingers!"
else
message --> object # do what you normally do
'dissolve' :
if sticky then {
write "I dissolved the super glue."
sticky := FALSE
}
else
write "It's already dissolved."
end
Conditionals ( =, ~=, >, <, >=, <= )
These are operators that compare two values and return either
TRUE or FALSE, if their operands are comparable, or UNDEFINED if
not. They are used almost exclusively within if, while, and for
statements, although they will always return their value no
matter where they are used.
If both operands are or can be converted to numbers, they are
compared numerically. If not, then they are compared as strings,
if possible. If they cannot be converted to strings, then the
quantitative comparisons ( <, >, <=, >= ) will return UNDEFINED.
The equal ( = ) and unequal ( ~= ) operators are special because
they can compare non-numeric, non-string values to simply see if
they are identical or not. Even though the operators ( <=, >= )
mean "less than or equal" and "greater than or equal"
respectively, these cannot be used in all the same places because
they are still checking quantitative equality. A few examples
will make things clearer:
Comparison Result
5 < 6 TRUE because five is less than six.
"mosquito" < "moth" TRUE because "mosquito" comes
before "moth" in the ASCII
alphabet.
5 < "four" TRUE. Since "four" cannot be
converted to a number (it is not
composed of digits), 5 is converted
to the string "5", and numbers
always come before letters in the
ASCII alphabet.
5 < "4" FALSE. "4" can be converted to the
number 4; they are compared as such
and 5 is greater than 4.
"abc" = "abc" TRUE.
"def" ~= "abc" TRUE. "def" is not "abc".
"abcd" = "abc" FALSE. Two strings must be the
same character for character in
order to be considered equal.
player.location = ballroom TRUE if, indeed, the location
attribute of the player object
points to the ballroom object.
7 <= 7 TRUE.
player.location <= ballroom UNDEFINED. There is no universal
sense in which object references
can be measured.
UNDEFINED < 7 UNDEFINED. UNDEFINED has no
measurable value in any sense.
UNDEFINED = 7 FALSE. 7 is indeed defined: as 7.
box.wearing = UNDEFINED TRUE if either the wearing
attribute of the box has not been
defined or if it has been
explicitly assigned the value of
UNDEFINED.
The Logical Operators ( and, or, not )
These operators always return values of TRUE and FALSE; they are
used within if, while, and for statements (although they will
return their values in other contexts as well) to take action
based on a number of conditions:
and will be TRUE if both its operands are neither FALSE,
ABSENT, or UNDEFINED.
or will be TRUE so long as at least one operand is neither
FALSE, ABSENT, or UNDEFINED.
not is unary; it returns TRUE if its operand is FALSE,
ABSENT, or UNDEFINED, and FALSE if not.
Because the precedences of these operators are all beneath those
of the comparison operators, you can form natural expressions
without parentheses such as:
if player.location = trapdoor_room and trapdoor.is_closed then
If you ever get confused, however, use parentheses to ensure
correctness. They will not take any more memory at run time.
However, familiarity with the operators' precedence is best of
all, and the fewer parentheses, the more readable your code.
The Arithmetic Operators ( +, -, *, /, ^ )
These perform simple arithmetic on numbers or values that can be
converted to numbers, returning the result. They are evaluated
as follows:
^ Exponentiation. Raises its left operand to the power
of its right. Performed right to left.
*, / Multiplication and division. Performed left to right.
+, - Addition and subtraction. Performed left to right.
This is the normal algebraic precedence of operators. Thus:
3 + 5 * 2 ^ 2 = 23
If you intend another precedence, simply use parentheses:
((3 + 5) * 2)^2 = 256
The String Operators ( &, within, length, leftfrom, rightfrom )
These operators manipulate strings. They are defined as follows:
& Concatenation. Both operands are converted to
strings; value is UNDEFINED if this is not
possible. Returns a new string formed by
concatenating the right operand to the left
operand. "the " & "cupboard" becomes
"the cupboard".
within Search. Both operands are converted to strings;
value is UNDEFINED if this is not possible.
Returns an integer representing the position in
the second string where the first string can be