Expression Syntax
Jump to navigation
Jump to search
An expression combines any number of numbers, strings, variables, and functions with operators. An expression evaluates to a numeric or string value. The general, recursive definition of an expression is
[EXPRESSION] = [sign] [ATOMIC] [op] [ATOMIC] [op] [ATOMIC] ... [op] [ATOMIC]
where
[sign]is an optional leading sign of+or-[op]are operators that determine how the[ATOMIC]'s are combined. The options are:+for addition-for subtraction*for multiplication/for division^for raising to a power&for string concatenation
^followed by*and/followed by+and-. When there are multiple operators of the same precedence, they are evaluated left to right.[ATOMIC]are the elements that are combined. The possible atomics are:- An unsigned number (23, 2.234, 3e2, 4.56e-3, ...)
- A variable (such as
#varname,#x[2],#z[#i][#j], etc.) and the value of the variable is used. The variable must have been previously defined. - Text in quotes ("some text") and the value is the text after the quotes are removed.
- Unquoted text and the value is all the text between the operators after all spaces have been removed. To include spaces in text
[ATOMIC]'s, the text must be quoted. - Another expression in parenthesis or
([EXPRESSION])and the value of the[ATOMIC]is the value of the included expression. - A function of an expression (such as
sin([EXPRESSION])) and the value of the[ATOMIC]is the value of the function applied to the value of the expression. The allowed functions are:sin()- sine of argument in radianscos()- cosine of argument in radianstan()- tangent of argument in radiansasin()- inverse sine with result in radiansacos()- inverse cosine with result in radiansatan()- inverse tangent with result in radiansexp()- exponentiallog()- natural loglog10()- log base 10sqrt()- square rootabs()- absolute valuesinh()- hyperbolic sinecosh()- hyperbolic cosinetanh()- hyperbolic tangentint()- integer partsign()- 1 if argument is positive or 0 if it is negativerand()- a random number between 0 and the argument.erf()- error function.erfc()- error function complement.length()- number of characters in a string.words()- number of words in a string.firstWord()- first word in a string.lastWord()- last word in a string.removeFirstWord()- string with first word removed.removeLastWord()- string with last word removed.chars(c1\c2\string)- returns charactersc1toc2ofstring(the first character is character 1).c1defaults to 1 if omitted (or less than 0) andc2defaults to length ofstring(if omitted or larger). Thuschar(c1\string)gets character 1 to the end andchar(\c2\string)gets character 1 throughc2.word(w1\string)- returns wordw1ofstring. Ifw1is less than 1 or greater then number of words instring, an empty string is returned.offset(s1\c1\string)- returns offset of strings1in string at or after characterc1(the first character is character 1) or returns 0 if strings1is not found. c1 can be omitted to finds1any place instring. The search is case insensitive.replace(s1\s2\string)- returns string where all occurrences of strings1instringare replaced with strings2.s2may be omitted to delete all occurrences of strings1.upperCase()- convert string to upper case.lowerCase()- convert string to lower case.titleCase()- convert to string with capitalized words.
- <a name="atexpr"></a>An "at" expression beginning in an
@sign and containing specific items separated by periods, such as "@key.TopLeft.x" to evaluate to the x value of the keypoint named "TopLeft":- The available "at" expressions are defined elsewhere (see <a href="keypoint.html">Keypoint</a> and <a href="path.html">Path</a> commands, for example).
- Any of the period-delimited items can be a variable (such as
@key.#kname.x) and the contents of#knamewill replace that item in the expression. - Variables used as items can only be a single variable and not an expression. They also cannot be an array variable with a variable index (e.g., it can be
#n[3]but not#n[#i]). Hint: if you need to index an array, you can define simple variable first (e.g.,#ni=#n[#i]) and then use that in an expression (e.g.,@key.#ni.y).
Notes
- An assignment command can be combined with an operator as in
#x [op] = [EXPRESSION]
which is equivalent to
#x = #x [op] ([EXPRESSION])
provided the variable is already a defined variable. It is an error if the variable has not previously been defined.