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@
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@ 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@ @-(3 + 2) == -5@ Negate a number (make it negative if positive and vice versa) ===The + operator=== The @+@ operator has three functions * It adds [[type:int]]s (also [[type:double]]s), @1+1 == 2@ * It concatenates strings, @"1" + "1" == "11"@ * 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@
@"x" == "x"@
@1 + 1 == "2"@ Are two numbers or strings the same? @=@ can also be used instead. | @a != b@ @1 + 1 != 3@
@"x" != "y"@ Are two numbers or strings different? | @a < b@ @1 < 2@
@"x" < "y"@ Is a less than b? Uses [[http://en.wikipedia.org/wiki/Lexicographical_order|lexicographic order]] for strings. | @a > b@ @2 > 1@
@"y" > "x"@ Is a greater than b? | @a <= b@ @1 <= 1@
@"x" <= "y"@ Is a less than b or are they equal? | @a >= b@ @2 >= 1@
@"x" >= "x"@ Is a greater than b or are they equal? | @min(a,b)@ @min(1,2) == 1@ Returns the smallest of two values. | @max(a,b)@ @max(1,2) == 2@ Returns the largest of two 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@ a or b a and b a xor b | @false@ @false@ @false@ @false@ @false@ | @false@ @true@ @true@ @false@ @true@ | @true@ @false@ @true@ @false@ @true@ | @true@ @true@ @true@ @true@ @false@ --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 | @*@, @/@, @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
next: Variables and functions →