Operators

To get more complicated expressions you combine them using operators.

--Basic mathematics--
MSE script supports most basic mathamatical operators:
! Operator	Example			Description
| @a + b@	@3 + 2 == 5@<br/>	Add two numbers,
		@"3" + "2" == "32"@	concatenate two strings or compose two functions (see below)
| @a - b@	@3 - 2 == 1@		Substract two numbers
| @a * b@	@3 * 2 == 6@		Multiply two numbers
| @a / b@	@3 / 2   == 1.5@	Divide two numbers. Does not round, always produces a [[type:double]].
| @a div b@	@3 div 2 == 1@		DOC_MSE_VERSION: since 0.3.7
		 			Divide two numbers. Rounds towards zero, producing an [[type:int]].
| @a mod b@	@3 mod 2 == 1@		Take the remainder after integer division (modulo)
| @a ^ b@	@3 ^ 2 == 9@		DOC_MSE_VERSION: since 0.3.7
		 			Exponentation, raise a to the power b.<br/> The numbers can be [[type:double]]s, so to calculate a square root use @2^0.5 == 1.41421356237@.
| @-a@		@-(3 + 2) == -5@	Negate a number (make it negative if positive and vice versa)

===The + operator===
The @+@ operator has four functions
* It adds [[type:int]]s (also [[type:double]]s), @1+1 == 2@
* It concatenates strings, @"1" + "1" == "11"@
* It concatenates lists, @[1] + [1] == [1,1]@
* It composes [[type:function]]s @(f + g) () == g( input: f() )@

--Comparison--
It is also possible to compare values. All comparisons evaluate to either @true@ or @false@.
! Operator	Example		Description
| @a == b@	@1 + 1 == 2@<br/>
		@"x" == "x"@<br/>
		@1 + 1 == "2"@	Are two numbers or strings the same? @=@ can also be used instead.
| @a != b@	@1 + 1 != 3@<br/>
		@"x" != "y"@	Are two numbers or strings different?
| @a < b@	@1 < 2@<br/>
		@"x" < "y"@ 	Is a less than b? Uses [[http://en.wikipedia.org/wiki/Lexicographical_order|lexicographic order]] for strings.
| @a > b@	@2 > 1@<br/>
		@"y" > "x"@	Is a greater than b?
| @a <= b@	@1 <= 1@<br/>
		@"x" <= "y"@	Is a less than b or are they equal?
| @a >= b@	@2 >= 1@<br/>
		@"x" >= "x"@	Is a greater than b or are they equal?
| @min(a,b)@	@min(1,2) == 1@	Returns the smallest of two or more values.
| @max(a,b)@	@max(1,2) == 2@	Returns the largest of two or more values.

--Booleans--
[[type:Boolean]]s (for example from comparisons) can be combined using:
| @a and b@	Are both @a@ and @b@ true?
| @a or b@	Is at least one of @a@ and @b@ true?
| @a xor b@	Is exactly one of @a@ and @b@ true?
| @not a@	Is @a@ false?
In a table:
! @a@		@b@		<tt>a or b</tt>	<tt>a and b</tt>	<tt>a xor b</tt>
| @false@	@false@		@false@		@false@		@false@
| @false@	@true@		@true@		@false@		@true@
| @true@	@false@		@true@		@false@		@true@
| @true@	@true@		@true@		@true@		@false@

The @and@ and @or@ operators use [[http://en.wikipedia.org/wiki/Short-circuit_evaluation|short-circuit evaluation]], which means that the second argument is only evaluated if the first argument does not suffice to determine the value of the expression.
For example
> true or card.field_that_does_not_exist
evaluates to @true@ instead of giving an error.

--Grouping and order--

Operators are ordered as usual, so
> 1 + 2 * 3  ==  1 + (2 * 3)  ==  7
Operators can be grouped differently using parentheses.
> (1 + 2) * 3  ==  3 * 3  ==  9

The exact order of precedence is given in the following table,
higher in the table means that this operator binds tighter to its arguments, @*@ binds tighter then @+@.
| @a(...)@, @a.b@, @a[b]@	Function calls, property access, see below
| @-a@, @not@ 			Unary operators
| @^@ 				Exponentiation
| @*@, @/@, @div@, @mod@	Multiplication and division
| @+@, @-@ 			Addition and substraction
| @==@, @!=@, @<@, @>@, @<=@, @>=@ 	Comparisons
| @and@, @or@, @xor@ 		Boolean operators
| @:=@ 				Assignement, see below
| @;@ 				Sequence, see below

--Properties--
Properties of types, as described in the [[type:index|data type section]] of the documentation, can be accessed using the @.@ operator:
> set.cards	# retrieve the 'cards' property of a set
The @[]@ operator has a similair purpose, only the property retrieved is determined by a string, so it can be changed:
> set["cards"]  # same as above
> c := "cards"
> set[c]        # again, the same

Multiple uses of these operators can be combined, for example:
> set.cards[0].card_color  #  the card color of the first card in the set

Note that a property named @card color@ is refered to as @card_color@ when using the @.@ operator, all spaces become underscores.
> style.padding left  # syntax error
> style.padding_left  # use this instead

--Assignment and sequence--
Values can be assigned to [[script:variables]] using the @:=@ operator:
> variable := 1 + 1
The result of this expression is the value assigned, this can be used to assign to multiple variables:
> var1 := var2 := 1 + 1
> # now var1 == 2 and var2 == 2

To combine multiple assignments into a single expression the ''sequencing operator'', @;@ can be used.
This first executes an expression, discards the result and then evaluates another one:
> var1 := 1 + 1  # assign
>    ;           # discard the result (i.e. 2)
> var1 * 2       # retrieve the value again, returns 4
Semicolons at the end of a line can be omitted, so the above can also be written simply as:
> var1 := 1 + 1
> var1 * 2

<div style="text-align:right;">next: <a href="variables">Variables and functions &rarr;</a></div>
