Sequences 2
Primer
Starting with two sequences:
sequence x = {1,2,3,4,5} sequence y = {600,700,800}
A tremendous wealth of sequence manipulations are possible:
Operation  Example  Check 

index 
? x[1]  is 1 ? x[$]  is 5 
minimum index is 1 maximum index is length 
slice 
? x[1..3]  is {1,2,3} ? x[2..4]  is {2,3,4} ? x[3..$]  is {3.4.5} 

concatenate 
? x & y  is {1,2,3,4,5,600,700,800} 
lengths are added 
splice 
? splice(x,y,2}  is {1,600,700,800,3,4,5} 
lengths are added 
remove 
? remove(x,2)  is {1,3,4,5} ? remove(x,2,4)  is {1,5} 
length  length_slice 
replace 
? replace(x,y,2)  is {1,600,700,800,3,4,5} ? replace(x,y,2,4)  is {1,600,700,800,5} 
length  length_slice + length_new 
prepend 
? prepend(x, y )  is {{600,700,800},1,2,3,4,5} 
length + 1 
insert 
? insert(x,y,2}  is {1,{600,700,800},2,3,4,5} 
length + 1 
append 
? append(x,y)  is {1,2,3,4,5,{600,700,800}} 
length + 1 
Operators
All of the relational, logical, and arithmetic operators, as well as the math routines described in Language Reference, can be applied to sequences as well as to single numbers (atoms).
Euphoria has very consistent syntax. So, once some property or feature of the language has been defined, it continues to be defined for all cases.
When applied to a sequence, a unary (one operand) operator is actually applied to each element in the sequence to yield a sequence of results of the same length. If one of these elements is itself a sequence then the same rule is applied again recursively:.
x = {1, 2, 3, {4, 5}}  x is {1, 2, 3, {4, 5}}
The new sequence is of the exact same shape as the original. The negation operator ultimately has applied to every atomthe basic fundamental definition of negation has not changed, even when applied to a sequence.
If a binary (twooperand) operator has operands which are both sequences then the two sequences must be of the same length. The binary operation is then applied to corresponding elements taken from the two sequences to get a sequence of results:
x = {5, 6, 7, 8} + {10, 10, 20, 100}  x is {15, 16, 27, 108} x = {{1, 2, 3}, {4, 5, 6}} + {1, 0, 1}  ERROR: 2 != 3  but x = { {1, 2, 3} + {1, 0, 1}, {4, 5, 6} + {1, 0, 1} }  CORRECT  x is {{0, 2, 4}, {3, 5, 7}}
If a binary operator has one operand which is a sequence while the other is a single number (atom) then the single number is effectively repeated to form a sequence of equal length to the sequence operand. The rules for operating on two sequences then apply:
y = {4, 5, 6} w = 5 * y  w is {20, 25, 30}  effectively the same as  { 5, 5, 5 } * { 4, 5, 6 }  { 5*4, 5*5, 5*6 }  { 20, 25, 30 }
Since multiplication is a binary operation between two atoms, even when a sequence is involved, the fundamental behavior of multiplication does not change.
Binary operators, regardless of their action, continue to work just as they did before:
y = {4, 5, 6} x = {1, 2, 3} z = x + y  z is {5, 7, 9} z = x < y  z is {1, 1, 1} w = {{1, 2}, {3, 4}, {5}} w = w * y  w is {{4, 8}, {15, 20}, {30}} w = {1, 0, 0, 1} and {1, 1, 1, 0}  {1, 0, 0, 0} w = not {1, 5, 2, 0, 0}  w is {0, 0, 0, 1, 1}
The next example should only appear strange at first glance:
w = {1, 2, 3} = {1, 2, 4}  w is {1, 1, 0}  the first '=' is assignment, and  the second '=' is a relational operator that tests equality
By now it should make sense that it is not possible to compare two strings (or any two sequences) using the = operator. The '=' operator always compares two atoms!
? "APPLE" = "PEACH" > { 0, 0, 0, 0, 0 }  no single true or false result
It may be tempting, but wrong, to try this:
if "APPLE" = "ORANGE" then  ERROR!
The value for an if ... then condition must be an atomthe fundamental requirement for a conditional never changes. When '=' is applied as a comparison between sequences, it is never possible to produce an atom value.
To make things worse, "APPLE" has a length of 5, and "ORANGE" has a length of 6. It is not even possible to begin a comparison between these two strings.
Instead you should use the equal() builtin function:
if equal("APPLE", "ORANGE") then  CORRECT
In general, you can do relational comparisons using the compare() builtin function:
if compare("APPLE", "ORANGE") = 0 then  CORRECT
You can use compare() for other comparisons as well:
if compare("APPLE", "ORANGE") < 0 then  CORRECT  enter here if "APPLE" is less than "ORANGE" (TRUE)
Especially useful is the idiom compare(x, "") = 1 to determine whether x is a non empty sequence. compare(x, "") = 1 would test for x being an atom, but atom(x) = 1 does the same faster and is clearer to read.
Not Categorized, Please Help
