Difference between revisions of "LSL Operators"
(→Useful Snippets: Concatenation by list casting) |
Frionil Fang (talk | contribs) (I don't see any logical boolean precedence confusion existing anymore: 1 && 0 && 1 || 1 = 1; if OR had higher precendence, it would be 0) |
||
Line 1: | Line 1: | ||
{{LSL Header|ml=*}} | {{LSL Header|ml=*}} | ||
Operators are used to cause an operation (or mathematical action) to be performed on one (such as !) or two operands. The easy and common example is 1 + 2 where 1 and 2 are operands, and the '''+''' is the operator. This concept can be extended much further with LSL since operands can be variables with the special case of the assignment operators requiring that the left hand side be a variable. | Operators are used to cause an operation (or mathematical action) to be performed on one (such as !) or two operands. The easy and common example is 1 + 2 where 1 and 2 are operands, and the '''+''' is the operator. This concept can be extended much further with LSL since operands can be variables with the special case of the assignment operators requiring that the left hand side be a variable. | ||
Line 73: | Line 73: | ||
<code>integer six = 4 <nowiki>|</nowiki> 2;</code> | <code>integer six = 4 <nowiki>|</nowiki> 2;</code> | ||
|- | |- | ||
| <code> | | <code>&&</code> <code><nowiki>||</nowiki></code> | ||
|| logical AND, logical OR | |||
|| logical AND | |||
|| <code>integer isFalse = (FALSE && TRUE);</code> | || <code>integer isFalse = (FALSE && TRUE);</code> | ||
<code>integer isTrue = (FALSE <nowiki>||</nowiki> TRUE);</code> | |||
|- | |- | ||
| <code>=</code> <code>+=</code> <code>-=</code> <code>*=</code> <code>/=</code> <code>%=</code> | | <code>=</code> <code>+=</code> <code>-=</code> <code>*=</code> <code>/=</code> <code>%=</code> | ||
Line 109: | Line 106: | ||
'''Note:''' The order of | '''Note:''' The order of evaluation is from right to left. If the value of x starts as 1 then the first two conditions below evaluate false and the second two evaluate true: | ||
<syntaxhighlight lang="lsl2">(x && (x = 0) == 0 && x)</syntaxhighlight> | <syntaxhighlight lang="lsl2">(x && (x = 0) == 0 && x)</syntaxhighlight> | ||
Line 122: | Line 116: | ||
==+ Operator== | |||
'''Note:''' Equality test on lists does not compare contents, only the length. | '''Note:''' Equality test on lists does not compare contents, only the length. | ||
{| {{Prettytable}} | {| {{Prettytable}} | ||
|+ | |+ | ||
<code>result = left + right</code> | <code>result = left + right</code> | ||
|-{{Hl2}} | |-{{Hl2}} | ||
Line 174: | Line 168: | ||
|} | |} | ||
==Shorthand Operators== | |||
{| {{Prettytable}} | {| {{Prettytable}} | ||
|+ | |+ | ||
Alternatives to the simple '=' operator... | Alternatives to the simple '=' operator... | ||
|-{{Hl2}} | |-{{Hl2}} | ||
Line 233: | Line 227: | ||
Due to {{Wikipedia|De Morgan's laws|w=n}}, by row, code in the '''AND''' column is logically equivalent to code in the '''OR'''. '''a''' and '''b''' need not be variables, they can be expressions. In certain circumstances these equivalencies can be used to simplify complex code. It is important not to confuse the two sets when using them. The first two rows depict De Morgan's laws as it is formulated, the second two build upon it. | Due to {{Wikipedia|De Morgan's laws|w=n}}, by row, code in the '''AND''' column is logically equivalent to code in the '''OR'''. '''a''' and '''b''' need not be variables, they can be expressions. In certain circumstances these equivalencies can be used to simplify complex code. It is important not to confuse the two sets when using them. The first two rows depict De Morgan's laws as it is formulated, the second two build upon it. | ||
{{ | {{clear}} | ||
== Useful Snippets == | == Useful Snippets == | ||
Line 239: | Line 233: | ||
Typecasting can also be used if you have to concatenate many parts into a string: | Typecasting can also be used if you have to concatenate many parts into a string: | ||
<syntaxhighlight lang="lsl2">// the following twp statements are equivalent: | <syntaxhighlight lang="lsl2"> | ||
// the following twp statements are equivalent: | |||
string message1 = (string)["I have ", 5, " children at the average age of ", 8.2, " years"]; | string message1 = (string)["I have ", 5, " children at the average age of ", 8.2, " years"]; | ||
string message2 = "I have 5 children at the average age of 8.2000001 years";</syntaxhighlight> | string message2 = "I have 5 children at the average age of 8.2000001 years"; | ||
</syntaxhighlight> | |||
{{LSLC|}}{{LSLC|Syntax}}{{LSLC|Keywords}} | |||
{{LSLC|FixMe}}<!-- This article is woefully incomplete, it needs more Operator tables --> |
Revision as of 06:28, 29 October 2023
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Operators are used to cause an operation (or mathematical action) to be performed on one (such as !) or two operands. The easy and common example is 1 + 2 where 1 and 2 are operands, and the + is the operator. This concept can be extended much further with LSL since operands can be variables with the special case of the assignment operators requiring that the left hand side be a variable.
The following table lists the operators in descending order of evaluation, i.e. higher in the table means higher evaluation precedence. Multiple operators on the same line share evaluation precedence. Parenthesize an expression if you need to force an evaluation order.
Operator | Description | Usage Example |
---|---|---|
()
|
parentheses: grouping and evaluation precedence | integer val = a * (b + c);
|
[]
|
brackets: list constructor | list lst = [a, 2, "this", 0.01];
|
(type)
|
typecasting | string message = "The result is:" + (string)result;
|
! ~ ++ --
|
logical NOT, bitwise NOT, increment, decrement | counter++;
|
* / %
|
multiply/dot product, divide, modulus/cross product | integer rollover = (count + 1) % 5;
|
-
|
subtraction, negation | integer one = 3 - 2;
|
+
|
addition, string concatenation | integer two = 1 + 1;
|
+
|
list concatenation | list myList = [1, 2, 3] + [4, 5];
|
<< >>
|
arithmetic left shift, arithmetic right shift | integer eight = 4 << 1;
|
< <= > >=
|
less than, less than or equal to, greater than, greater than or equal to | integer isFalse = (6 <= 4);
|
== !=
|
comparison: equal, not equal | integer isFalse = ("this" == "that");
|
&
|
bitwise AND | integer zero = 4 & 2;
|
^
|
bitwise XOR | integer zero = 4 ^ 4;
|
|
|
bitwise OR | integer four = 4 | 4;
|
&& ||
|
logical AND, logical OR | integer isFalse = (FALSE && TRUE);
|
= += -= *= /= %=
|
assignment | integer four = 4;
|
Note: Modulus (%
), like division, cause a Script run-time error. Math Error when its second operand equals zero.
Note: The %
operator only accepts integer (%
as modulus) and vector (%
as cross product) operands.
Note: Unlike most other languages that use the C-style &&
and ||
operators, both operands are always evaluated. For example,
if (TRUE || 1/0) llSay(PUBLIC_CHANNEL, "Aha!");
- will cause a Math Error rather than say "Aha!"
Note: The ++
(increment) and --
(decrement) operators have two versions, pre- and post-. The pre-increment (or pre-decrement) operator increments (or decrements) its operand by 1; the value of the expression is the incremented (or decremented) value. The post-increment (or post-decrement) operator increases (or decreases) the value of its operand by 1, but the value of the expression is the operand's original value prior to the operation.
integer count = 0;
if( ++count == 1 ) // 'count' is incremented then evaluated.
llSay(PUBLIC_CHANNEL, "Aha"); // message will be said.
integer count = 0;
if( count++ == 1 ) // 'count' is evaluated then incremented.
llSay(PUBLIC_CHANNEL, "Aha"); // message will not be said.
Note: The order of evaluation is from right to left. If the value of x starts as 1 then the first two conditions below evaluate false and the second two evaluate true:
(x && (x = 0) == 0 && x)
(x && (x = 0) == 0 && x == 0)
(x == 0 && (x = 0) == 0)
(x == 0 && (x = 0) == 0 && x)
Both sides are evaluated regardless of the the truth of either side.
+ Operator
Note: Equality test on lists does not compare contents, only the length.
Left Type | Right Type | Result Type | Description |
---|---|---|---|
integer | integer | integer | Adds left and right |
integer | float | float | Adds left and right |
float | integer | float | Adds left and right |
string | string | string | Concatenates right onto the end of left. |
list | * | list | Concatenates right onto the end of left. |
* | list | list | Affixes left onto the start of right. |
vector | vector | vector | Adds left and right |
rotation | rotation | rotation | Adds left and right Not useful for combining rotations, use * or / instead. |
Shorthand Operators
Simple assignment operator | Shorthand operator |
---|---|
a = a + 1 | a += 1 |
a = a – 1 | a -= 1 |
a = a * (n+1) | a *= (n+1) |
a = a / (n+1) | a /= (n+1) |
a = a % b | a %= b |
De Morgan's laws
AND | OR |
---|---|
~(a & b) |
~a | ~b
|
~a & ~b |
~(a | b)
|
a & ~b |
~(~a | b)
|
~(a & ~b) |
~a | b
|
AND | OR |
---|---|
!(a && b) |
!a || !b
|
!a && !b |
!(a || b)
|
a && !b |
!(!a || b)
|
!(a && !b) |
!a || b
|
Due to De Morgan's laws, by row, code in the AND column is logically equivalent to code in the OR. a and b need not be variables, they can be expressions. In certain circumstances these equivalencies can be used to simplify complex code. It is important not to confuse the two sets when using them. The first two rows depict De Morgan's laws as it is formulated, the second two build upon it.
Useful Snippets
Typecasting can also be used if you have to concatenate many parts into a string:
// the following twp statements are equivalent:
string message1 = (string)["I have ", 5, " children at the average age of ", 8.2, " years"];
string message2 = "I have 5 children at the average age of 8.2000001 years";