{"section":"tutorials","requestedLocale":"en","requestedSlug":"expressions-glossary","locale":"en","slug":"expressions-glossary","path":"docs/en/tutorials/weni-by-vtex/flows/expressions-glossary.md","branch":"main","content":"Excellent gets its name from borrowing some of the syntax and function names of formulas in Microsoft Excel™, though it has evolved over time and similarities are now much fewer. It is an expression based templating language which aims to make it easy to generate text from a context of values.\n\n## Templates\n\nTemplates can contain single variables or more complex expressions. A single variable is embedded using the @ character. For example the template Hi @foo contains a single variable which at runtime will be replaced with the value of foo in the context.\n\nMore complex expressions can be embedded using the @(...) syntax. For example the template Hi @(\"\"Dr \"\" & upper(foo)) takes the value of foo, converts it to uppercase, and the prefixes it with another string. Note than within a complex expression you don’t prefix variables with @.\n\nThe @ symbol can be escaped in templates by repeating it, e.g, Hi @@twitter will output Hi @twitter.\n\n## Types\n\nExcellent has the following types[: Array](), [Boolea]()[n, Dat]()[e, DateTime](), [Function](), [Number](), [Object](https://app.rapidpro.io/mr/docs/expressions.html#type:object), [Text](), [Time]().\n\n### [array]()\n\nIs an array of items.\n\n    ```\n    @(array(1, \"\"x\"\", true)) → [1, x, true]\n\n    @(array(1, \"\"x\"\", true)[1]) → x\n\n    @(count(array(1, \"\"x\"\", true))) → 3\n\n    @(json(array(1, \"\"x\"\", true))) → [1,\"\"x\"\",true]\n    ```\n\n### [boolean]()\n\nIs a boolean true or false.\n\n    ```\n    @(true) → true\n\n    @(1 = 1) → true\n\n    @(1 = 2) → false\n\n    @(json(true)) → true\n    ```\n\n### [date]()\n\nIs a Gregorian calendar date value.\n\n    ```\n    @(date_from_parts(2019, 4, 11)) → 2019-04-11\n\n    @(format_date(date_from_parts(2019, 4, 11))) → 11-04-2019\n\n    @(json(date_from_parts(2019, 4, 11))) → \"\"2019-04-11\"\"\n    ```\n\n### [datetime]()\n\nIs a datetime value.\n\n    ```\n    @(datetime(\"\"1979-07-18T10:30:45.123456Z\"\")) → 1979-07-18T10:30:45.123456Z\n\n    @(format_datetime(datetime(\"\"1979-07-18T10:30:45.123456Z\"\"))) → 18-07-1979 05:30\n\n    @(json(datetime(\"\"1979-07-18T10:30:45.123456Z\"\"))) → \"\"1979-07-18T10:30:45.123456Z\"\"\n    ```\n\n### [function]()\n\nIs a callable function.\n\n    ```\n    @(upper) → upper\n\n    @(array(upper)[0](\"\"abc\"\")) → ABC\n\n    @(json(upper)) → null\n    ```\n\n### [number]()\n\nIs a whole or fractional number.\n\n    ```\n    @(1234) → 1234\n\n    @(1234.5678) → 1234.5678\n\n    @(format_number(1234.5670)) → 1,234.567\n\n    @(json(1234.5678)) → 1234.5678\n    ```\n\n### [object]()\n\nIs an object with named properties.\n\n    ```\n    @(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\")) → {bar: x, foo: 1}\n\n    @(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\").bar) → x\n\n    @(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\")[\"\"bar\"\"]) → x\n\n    @(count(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\"))) → 2\n\n    @(json(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\"))) → {\"\"bar\"\":\"\"x\"\",\"\"foo\"\":1}\n    ```\n\n### [text]()\n\nIs a string of characters.\n\n    ```\n    @(\"\"abc\"\") → abc\n\n    @(text_length(\"\"abc\"\")) → 3\n\n    @(upper(\"\"abc\"\")) → ABC\n\n    @(json(\"\"abc\"\")) → \"\"abc\"\"\n    ```\n\n### [time]()\n\nIs a time of day.\n\n    ```\n    @(time_from_parts(16, 30, 45)) → 16:30:45.000000\n\n    @(format_time(time_from_parts(16, 30, 45))) → 16:30\n\n    @(json(time_from_parts(16, 30, 45))) → \"\"16:30:45.000000\"\"\n    ```\n\n## Operators\n\n### [+](https://app.rapidpro.io/mr/docs/expressions.html#operator:add)\n\nAdds two numbers.\n\n    ```\n    @(2 + 3) → 5\n\n    @(fields.age + 10) → 33\n    ```\n\n### [&](https://app.rapidpro.io/mr/docs/expressions.html#operator:concatenate)\n\nJoins two text values together.\n\n    ```\n    @(\"\"hello\"\" & \"\" \"\" & \"\"bar\"\") → hello bar\n\n    @(\"\"hello\"\" & null) → hello\n    ```\n\n### [/](https://app.rapidpro.io/mr/docs/expressions.html#operator:divide)\n\nDivides a number by another.\n\n    ```\n    @(4 / 2) → 2\n\n    @(3 / 2) → 1.5\n\n    @(46 / fields.age) → 2\n\n    @(3 / 0) → ERROR\n    ```\n\n### [=](https://app.rapidpro.io/mr/docs/expressions.html#operator:equal)\n\nReturns true if two values are textually equal.\n\n    ```\n    @(\"\"hello\"\" = \"\"hello\"\") → true\n\n    @(\"\"hello\"\" = \"\"bar\"\") → false\n\n    @(1 = \"\"1\"\") → true\n    ```\n\n### [^](https://app.rapidpro.io/mr/docs/expressions.html#operator:exponent)\n\nRaises a number to the power of a another number.\n\n    ```\n    @(2 ^ 8) → 256\n    ```\n\n### [>](https://app.rapidpro.io/mr/docs/expressions.html#operator:greaterthan)\n\nReturns true if the first number is greater than the second.\n\n    ```\n    @(2 > 3) → false\n\n    @(3 > 3) → false\n\n    @(4 > 3) → true\n    ```\n\n### [>=]()\n\nReturns true if the first number is greater than or equal to the second.\n\n    ```\n    @(2 >= 3) → false\n\n    @(3 >= 3) → true\n\n    @(4 >= 3) → true\n    ```\n\n### [<](https://app.rapidpro.io/mr/docs/expressions.html#operator:lessthan)\n\nReturns true if the first number is less than the second.\n\n    ```\n    @(2 < 3) → true\n\n    @(3 < 3) → false\n\n    @(4 < 3) → false\n    ```\n\n### [<=]()\n\nReturns true if the first number is less than or equal to the second.\n\n    ```\n    @(2 <= 3) → true\n\n    @(3 <= 3) → true\n\n    @(4 <= 3) → false\n    ```\n\n### [\\*](https://app.rapidpro.io/mr/docs/expressions.html#operator:multiply)\n\nMultiplies two numbers.\n\n    ```\n    @(3 * 2) → 6\n\n    @(fields.age * 3) → 69\n    ```\n\n### [\\- (unary)]()\n\nNegates a number\n\n    ```\n    @(-fields.age) → -23\n    ```\n\n### [!=]()\n\nReturns true if two values are textually not equal.\n\n    ```\n    @(\"\"hello\"\" != \"\"hello\"\") → false\n\n    @(\"\"hello\"\" != \"\"bar\"\") → true\n\n    @(1 != 2) → true\n    ```\n\n### [\\- (binary)]()\n\nSubtracts two numbers.\n\n    ```\n    @(3 - 2) → 1\n\n    @(2 - 3) → -1\n    ```\n\n## Functions\n\nExpressions have access to a set of built-in functions which can be used to perform more complex tasks. Functions are called using the @(function_name(args..)) syntax, and can take as arguments either literal values @(length(split(\"\"1 2 3\"\", \"\" \"\")) or variables in the context @(title(contact.name)).\n\n### [abs(number)]()\n\nReturns the absolute value of number.\n\n    ```\n    @(abs(-10)) → 10\n\n    @(abs(10.5)) → 10.5\n\n    @(abs(\"\"foo\"\")) → ERROR\n    ```\n\n### [and(values…)]()\n\nReturns whether all the given values are truthy.\n\n    ```\n    @(and(true)) → true\n\n    @(and(true, false, true)) → false\n    ```\n\n### [array(values…)]()\n\nTakes multiple values and returns them as an array.\n\n    ```\n    @(array(\"\"a\"\", \"\"b\"\", 356)[1]) → b\n\n    @(join(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), \"\"|\"\")) → a|b|c\n\n    @(count(array())) → 0\n\n    @(count(array(\"\"a\"\", \"\"b\"\"))) → 2\n    ```\n\n### [attachment_parts(attachment)]()\n\nParses an attachment into its different parts\n\n    ```\n    @(attachment_parts(\"\"image/jpeg:https://example.com/test.jpg\"\")) → {content_type: image/jpeg, url: https://example.com/test.jpg}\n    ```\n\n### [boolean(value)]()\n\nTries to convert value to a boolean. An error is returned if the value can’t be converted.\n\n    ```\n    @(boolean(array(1, 2))) → true\n\n    @(boolean(\"\"FALSE\"\")) → false\n\n    @(boolean(1 / 0)) → ERROR\n    ```\n\n### [char(code)]()\n\nReturns the character for the given UNICODE code. It is the inverse of [code]().\n\n    ```\n    @(char(33)) → !\n\n    @(char(128512)) → 😀\n\n    @(char(\"\"foo\"\")) → ERROR\n    ```\n\n### [clean(text)]()\n\nRemoves any non-printable characters from text.\n\n    ```\n    @(clean(\"\"😃 Hello \\nwo\\tr\\rld\"\")) → 😃 Hello world\n\n    @(clean(123)) → 123\n    ```\n\n### [code(text)]()\n\nReturns the UNICODE code for the first character of text. It is the inverse of [char](https://app.rapidpro.io/mr/docs/expressions.html#function:char).\n\n    ```\n    @(code(\"\"a\"\")) → 97\n\n    @(code(\"\"abc\"\")) → 97\n\n    @(code(\"\"😀\"\")) → 128512\n\n    @(code(\"\"15\"\")) → 49\n\n    @(code(15)) → 49\n\n    @(code(\"\"\"\")) → ERROR\n    ```\n\n### [concat(array1, array2)]()\n\nReturns the result of concatenating two arrays.\n\n    ```\n    @(concat(array(\"\"a\"\", \"\"b\"\"), array(\"\"c\"\", \"\"d\"\"))) → [a, b, c, d]\n\n    @(unique(concat(array(1, 2, 3), array(3, 4)))) → [1, 2, 3, 4]\n    ```\n\n### [contains(array, value)]()\n\nReturns whether array contains value.\n\n    ```\n    @(contains(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), \"\"a\"\")) → true\n\n    @(contains(array(1, 2, 3), 4)) → false\n    ```\n\n### [count(value)]()\n\nReturns the number of items in the given array or properties on an object. It will return an error if it is passed an item which isn’t countable.\n\n    ```\n    @(count(contact.fields)) → 6\n\n    @(count(array())) → 0\n\n    @(count(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"))) → 3\n\n    @(count(1234)) → ERROR\n    ```\n\n### [date(value)]()\n\nTries to convert value to a date. If it is text then it will be parsed into a date using the default date format. An error is returned if the value can’t be converted.\n\n    ```\n    @(date(\"\"1979-07-18\"\")) → 1979-07-18\n\n    @(date(\"\"1979-07-18T10:30:45.123456Z\"\")) → 1979-07-18\n\n    @(date(\"\"10/05/2010\"\")) → 2010-05-10\n\n    @(date(\"\"NOT DATE\"\")) → ERROR\n    ```\n\n### [date_from_parts(year, month, day)]()\n\nCreates a date from year, month and day.\n\n    ```\n    @(date_from_parts(2017, 1, 15)) → 2017-01-15\n\n    @(date_from_parts(2017, 2, 31)) → 2017-03-03\n\n    @(date_from_parts(2017, 13, 15)) → ERROR\n    ```\n\n### [datetime(value)]()\n\nTries to convert value to a datetime. If it is text then it will be parsed into a datetime using the default date and time formats. An error is returned if the value can’t be converted.\n\n    ```\n    @(datetime(\"\"1979-07-18\"\")) → 1979-07-18T00:00:00.000000-05:00\n\n    @(datetime(\"\"1979-07-18T10:30:45.123456Z\"\")) → 1979-07-18T10:30:45.123456Z\n\n    @(datetime(\"\"10/05/2010\"\")) → 2010-05-10T00:00:00.000000-05:00\n\n    @(datetime(\"\"NOT DATE\"\")) → ERROR\n    ```\n\n### [datetime_add(datetime, offset, unit)]()\n\nCalculates the date value arrived at by adding offset number of unit to the datetime\nValid durations are “Y” for years, “M” for months, “W” for weeks, “D” for days, “h” for hour, “m” for minutes, “s” for seconds\n\n    ```\n    @(datetime_add(\"\"2017-01-15\"\", 5, \"\"D\"\")) → 2017-01-20T00:00:00.000000-05:00\n\n    @(datetime_add(\"\"2017-01-15 10:45\"\", 30, \"\"m\"\")) → 2017-01-15T11:15:00.000000-05:00\n    ```\n\n### [datetime_diff(date1, date2, unit)]()\n\nReturns the duration between date1 and date2 in the unit specified.\n\nValid durations are “Y” for years, “M” for months, “W” for weeks, “D” for days, “h” for hour, “m” for minutes, “s” for seconds.\n\n    ```\n    @(datetime_diff(\"\"2017-01-15\"\", \"\"2017-01-17\"\", \"\"D\"\")) → 2\n\n    @(datetime_diff(\"\"2017-01-15\"\", \"\"2017-05-15\"\", \"\"W\"\")) → 17\n\n    @(datetime_diff(\"\"2017-01-15\"\", \"\"2017-05-15\"\", \"\"M\"\")) → 4\n\n    @(datetime_diff(\"\"2017-01-17 10:50\"\", \"\"2017-01-17 12:30\"\", \"\"h\"\")) → 1\n\n    @(datetime_diff(\"\"2017-01-17\"\", \"\"2015-12-17\"\", \"\"Y\"\")) → -2\n    ```\n\n### [datetime_from_epoch(seconds)]()\n\nConverts the UNIX epoch time seconds into a new date.\n\n    ```\n    @(datetime_from_epoch(1497286619)) → 2017-06-12T11:56:59.000000-05:00\n\n    @(datetime_from_epoch(1497286619.123456)) → 2017-06-12T11:56:59.123456-05:00\n    ```\n\n### [default(value, default)]()\n\nReturns value if is not empty or an error, otherwise it returns default.\n\n    ```\n    @(default(undeclared.var, \"\"default_value\"\")) → default_value\n\n    @(default(\"\"10\"\", \"\"20\"\")) → 10\n\n    @(default(\"\"\"\", \"\"value\"\")) → value\n\n    @(default(\"\"  \"\", \"\"value\"\")) → \\x20\\x20\n\n    @(default(datetime(\"\"invalid-date\"\"), \"\"today\"\")) → today\n\n    @(default(format_urn(\"\"invalid-urn\"\"), \"\"ok\"\")) → ok\n    ```\n\n### [epoch(date)]()\n\nConverts date to a UNIX epoch time.\n\nThe returned number can contain fractional seconds.\n\n    ```\n    @(epoch(\"\"2017-06-12T16:56:59.000000Z\"\")) → 1497286619\n\n    @(epoch(\"\"2017-06-12T18:56:59.000000+02:00\"\")) → 1497286619\n\n    @(epoch(\"\"2017-06-12T16:56:59.123456Z\"\")) → 1497286619.123456\n\n    @(round_down(epoch(\"\"2017-06-12T16:56:59.123456Z\"\"))) → 1497286619\n    ```\n\n### [extract(object, properties)]()\n\nTakes an object and extracts the named property.\n\n    ```\n    @(extract(contact, \"\"name\"\")) → Ryan Lewis\n\n    @(extract(contact.groups[0], \"\"name\"\")) → Testers\n    ```\n\n### [extract_object(object, properties…)]()\n\nTakes an object and returns a new object by extracting only the named properties.\n\n    ```\n    @(extract_object(contact.groups[0], \"\"name\"\")) → {name: Testers}\n    ```\n\n### [field(text, index, delimiter)]()\n\nSplits text using the given delimiter and returns the field at index.\n\nThe index starts at zero. When splitting with a space, the delimiter is considered to be all whitespace.\n\n    ```\n    @(field(\"\"a,b,c\"\", 1, \"\",\"\")) → b\n\n    @(field(\"\"a,,b,c\"\", 1, \"\",\"\")) →\n\n    @(field(\"\"a   b c\"\", 1, \"\" \"\")) → b\n\n    @(field(\"\"a      b   c   d\"\", 1, \"\"    \"\")) →\n\n    @(field(\"\"a\\t\\tb\\tc\\td\"\", 1, \"\" \"\")) →\n\n    @(field(\"\"a,b,c\"\", \"\"foo\"\", \"\",\"\")) → ERROR\n    ```\n\n### [foreach(values, func, [args…])]()\n\nCreates a new array by applying func to each value in values.\n\nIf the given function takes more than one argument, you can pass additional arguments after the function.\n\n    ```\n    @(foreach(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), upper)) → [A, B, C]\n\n    @(foreach(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), (x) => x & \"\"1\"\")) → [a1, b1, c1]\n\n    @(foreach(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), (x) => object(\"\"v\"\", x))) → [{v: a}, {v: b}, {v: c}]\n\n    @(foreach(array(\"\"the man\"\", \"\"fox\"\", \"\"jumped up\"\"), word, 0)) → [the, fox, jumped]\n    ```\n\n### [foreach_value(object, func, [args…])]()\n\nCreates a new object by applying func to each property value of object.\n\nIf the given function takes more than one argument, you can pass additional arguments after the function.\n\n    ```\n    @(foreach_value(object(\"\"a\"\", \"\"x\"\", \"\"b\"\", \"\"y\"\"), upper)) → {a: X, b: Y}\n\n    @(foreach_value(object(\"\"a\"\", \"\"hi there\"\", \"\"b\"\", \"\"good bye\"\"), word, 1)) → {a: there, b: bye}\n    ```\n\n### [format(value)]()\n\nFormats value according to its type.\n\n    ```\n    @(format(1234.5670)) → 1,234.567\n\n    @(format(now())) → 11-04-2018 13:24\n\n    @(format(today())) → 11-04-2018\n    ```\n\n### [format_date(date, [,format])]()\n\nFormats date as text according to the given format.\n\nIf format is not specified then the environment’s default format is used. The format string can consist of the following characters. The characters ’ ‘,’:‘,’,‘, ’T’, ‘-’ and ’\\_’ are ignored. Any other character is an error.\n\n- YY - last two digits of year 0-99\n- YYYY - four digits of year 0000-9999\n- M - month 1-12\n- MM - month, zero padded 01-12\n- MMM - month Jan-Dec (localized)\n- MMMM - month January-December (localized)\n- D - day of month, 1-31\n- DD - day of month, zero padded 01-31\n- EEE - day of week Mon-Sun (localized)\n- EEEE - day of week Monday-Sunday (localized)\n\n  ```\n  @(format_date(\"\"1979-07-18T15:00:00.000000Z\"\")) → 18-07-1979\n\n  @(format_date(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"YYYY-MM-DD\"\")) → 1979-07-18\n\n  @(format_date(\"\"2010-05-10T19:50:00.000000Z\"\", \"\"YYYY M DD\"\")) → 2010 5 10\n\n  @(format_date(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"YYYY\"\")) → 1979\n\n  @(format_date(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"M\"\")) → 7\n\n  @(format_date(\"\"NOT DATE\"\", \"\"YYYY-MM-DD\"\")) → ERROR\n  ```\n\n### [format_datetime(datetime [,format [,timezone]])]()\n\nFormats datetime as text according to the given format.\n\nIf format is not specified then the environment’s default format is used. The format string can consist of the following characters. The characters ’ ‘,’:‘,’,‘, ’T’, ‘-’ and ’\\_’ are ignored. Any other character is an error.\n\n- YY - last two digits of year 0-99\n- YYYY - four digits of year 0000-9999\n- M - month 1-12\n- MM - month, zero padded 01-12\n- MMM - month Jan-Dec (localized)\n- MMMM - month January-December (localized)\n- D - day of month, 1-31\n- DD - day of month, zero padded 01-31\n- EEE - day of week Mon-Sun (localized)\n- EEEE - day of week Monday-Sunday (localized)\n- h - hour of the day 1-12\n- hh - hour of the day, zero padded 01-12\n- t - twenty four hour of the day 0-23\n- tt - twenty four hour of the day, zero padded 00-23\n- m - minute 0-59\n- mm - minute, zero padded 00-59\n- s - second 0-59\n- ss - second, zero padded 00-59\n- fff - milliseconds\n- ffffff - microseconds\n- fffffffff - nanoseconds\n- aa - am or pm (localized)\n- AA - AM or PM (localized)\n- Z - hour and minute offset from UTC, or Z for UTC\n- ZZZ - hour and minute offset from UTC\n\nTimezone should be a location name as specified in the IANA Time Zone database, such as “America/Guayaquil” or “America/Los_Angeles”. If not specified, the current timezone will be used. An error will be returned if the timezone is not recognized.\n\n    ```\n    @(format_datetime(\"\"1979-07-18T15:00:00.000000Z\"\")) → 18-07-1979 10:00\n\n    @(format_datetime(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"YYYY-MM-DD\"\")) → 1979-07-18\n\n    @(format_datetime(\"\"2010-05-10T19:50:00.000000Z\"\", \"\"YYYY M DD tt:mm\"\")) → 2010 5 10 14:50\n\n    @(format_datetime(\"\"2010-05-10T19:50:00.000000Z\"\", \"\"YYYY-MM-DD hh:mm AA\"\", \"\"America/Los_Angeles\"\")) → 2010-05-10 12:50 PM\n\n    @(format_datetime(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"YYYY\"\")) → 1979\n\n    @(format_datetime(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"M\"\")) → 7\n\n    @(format_datetime(\"\"NOT DATE\"\", \"\"YYYY-MM-DD\"\")) → ERROR\n    ```\n\n### [format_location(location)]()\n\nFormats the given location as its name.\n\n    ```\n    @(format_location(\"\"Rwanda\"\")) → Rwanda\n\n    @(format_location(\"\"Rwanda > Kigali\"\")) → Kigali\n    ```\n\n### [format_number(number, places [, humanize])]()\n\nFormats number to the given number of decimal places.\n\nAn optional third argument humanize can be false to disable the use of thousand separators.\n\n    ```\n    @(format_number(1234)) → 1,234\n\n    @(format_number(1234.5670)) → 1,234.567\n\n    @(format_number(1234.5670, 2, true)) → 1,234.57\n\n    @(format_number(1234.5678, 0, false)) → 1235\n\n    @(format_number(\"\"foo\"\", 2, false)) → ERROR\n    ```\n\n### [format_time(time [,format])]()\n\nFormats time as text according to the given format.\n\nIf format is not specified then the environment’s default format is used. The format string can consist of the following characters. The characters ’ ‘,’:‘,’,‘, ’T’, ‘-’ and ’\\_’ are ignored. Any other character is an error.\n\n- h - hour of the day 1-12\n- hh - hour of the day, zero padded 01-12\n- t - twenty four hour of the day 0-23\n- tt - twenty four hour of the day, zero padded 00-23\n- m - minute 0-59\n- mm - minute, zero padded 00-59\n- s - second 0-59\n- ss - second, zero padded 00-59\n- fff - milliseconds\n- ffffff - microseconds\n- fffffffff - nanoseconds\n- aa - am or pm (localized)\n- AA - AM or PM (localized)\n\n  ```\n  @(format_time(\"\"14:50:30.000000\"\")) → 14:50\n\n  @(format_time(\"\"14:50:30.000000\"\", \"\"h:mm aa\"\")) → 2:50 pm\n\n  @(format_time(\"\"15:00:27.000000\"\", \"\"s\"\")) → 27\n\n  @(format_time(\"\"NOT TIME\"\", \"\"hh:mm\"\")) → ERROR\n  ```\n\n### [format_urn(urn)]()\n\nFormats urn into human friendly text.\n\n    ```\n    @(format_urn(\"\"tel:+250781234567\"\")) → 0781 234 567\n\n    @(format_urn(\"\"twitter:134252511151#billy_bob\"\")) → billy_bob\n\n    @(format_urn(contact.urn)) → (202) 456-1111\n\n    @(format_urn(urns.tel)) → (202) 456-1111\n\n    @(format_urn(urns.mailto)) → foo@bar.com\n\n    @(format_urn(\"\"NOT URN\"\")) → ERROR\n    ```\n\n### [html_decode(text)]()\n\nHTML decodes text\n\n    ```\n    @(html_decode(\"\"Red &amp; Blue\"\")) → Red & Blue\n\n    @(html_decode(\"\"5 + 10\"\")) → 5 + 10\n    ```\n\n### [if(test, value1, value2)]()\n\nReturns value1 if test is truthy or value2 if not.\n\nIf the first argument is an error that error is returned.\n\n    ```\n    @(if(1 = 1, \"\"foo\"\", \"\"bar\"\")) → foo\n\n    @(if(\"\"foo\"\" > \"\"bar\"\", \"\"foo\"\", \"\"bar\"\")) → ERROR\n    ```\n\n### [is_error(value)]()\n\nReturns whether value is an error\n\n    ```\n    @(is_error(datetime(\"\"foo\"\"))) → true\n\n    @(is_error(run.not.existing)) → true\n\n    @(is_error(\"\"hello\"\")) → false\n    ```\n\n### [join(array, separator)]()\n\nJoins the given array of strings with separator to make text.\n\n    ```\n    @(join(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), \"\"|\"\")) → a|b|c\n\n    @(join(split(\"\"a.b.c\"\", \"\".\"\"), \"\" \"\")) → a b c\n    ```\n\n### [json(value)]()\n\nReturns the JSON representation of value.\n\n    ```\n    @(json(\"\"string\"\")) → \"\"string\"\"\n\n    @(json(10)) → 10\n\n    @(json(null)) → null\n\n    @(json(contact.uuid)) → \"\"5d76d86b-3bb9-4d5a-b822-c9d86f5d8e4f\"\"\n    ```\n\n### [keys(object)]()\n\nReturns an array containing the property keys of object.\n\n    ```\n    @(keys(object(\"\"a\"\", 123, \"\"b\"\", \"\"hello\"\", \"\"c\"\", \"\"world\"\"))) → [a, b, c]\n\n    @(keys(null)) → []\n\n    @(keys(\"\"string\"\")) → ERROR\n\n    @(keys(10)) → ERROR\n    ```\n\n### [lower(text)]()\n\nConverts text to lowercase.\n\n    ```\n    @(lower(\"\"HellO\"\")) → hello\n\n    @(lower(\"\"hello\"\")) → hello\n\n    @(lower(\"\"123\"\")) → 123\n\n    @(lower(\"\"😀\"\")) → 😀\n    ```\n\n### [max(numbers…)]()\n\nReturns the maximum value in numbers.\n\n    ```\n    @(max(1, 2)) → 2\n\n    @(max(1, -1, 10)) → 10\n\n    @(max(1, 10, \"\"foo\"\")) → ERROR\n    ```\n\n### [mean(numbers…)]()\n\nReturns the arithmetic mean of numbers.\n\n    ```\n    @(mean(1, 2)) → 1.5\n\n    @(mean(1, 2, 6)) → 3\n\n    @(mean(1, \"\"foo\"\")) → ERROR\n    ```\n\n### [min(numbers…)]()\n\nReturns the minimum value in numbers.\n\n    ```\n    @(min(1, 2)) → 1\n\n    @(min(2, 2, -10)) → -10\n\n    @(min(1, 2, \"\"foo\"\")) → ERROR\n    ```\n\n### [mod(dividend, divisor)]()\n\nReturns the remainder of the division of dividend by divisor.\n\n    ```\n    @(mod(5, 2)) → 1\n\n    @(mod(4, 2)) → 0\n\n    @(mod(5, \"\"foo\"\")) → ERROR\n    ```\n\n### [now()]()\n\nReturns the current date and time in the current timezone.\n\n    ```\n    @(now()) → 2018-04-11T13:24:30.123456-05:00\n    ```\n\n### [number(value)]()\n\nTries to convert value to a number.\n\nAn error is returned if the value can’t be converted.\n\n    ```\n    @(number(10)) → 10\n\n    @(number(\"\"123.45000\"\")) → 123.45\n\n    @(number(\"\"what?\"\")) → ERROR\n    ```\n\n### [object(pairs…)]()\n\nTakes property name value pairs and returns them as a new object.\n\n    ```\n    @(object()) → {}\n\n    @(object(\"\"a\"\", 123, \"\"b\"\", \"\"hello\"\")) → {a: 123, b: hello}\n\n    @(object(\"\"a\"\")) → ERROR\n    ```\n\n### [or(values…)]()\n\nReturns whether if any of the given values are truthy.\n\n    ```\n    @(or(true)) → true\n\n    @(or(true, false, true)) → true\n    ```\n\n### [parse_datetime(text, format [,timezone])]()\n\nParses text into a date using the given format.\n\nThe format string can consist of the following characters. The characters ’ ‘,’:‘,’,‘, ’T’, ‘-’ and ’\\_’ are ignored. Any other character is an error.\n\n- YY - last two digits of year 0-99\n- YYYY - four digits of year 0000-9999\n- M - month 1-12\n- MM - month, zero padded 01-12\n- D - day of month, 1-31\n- DD - day of month, zero padded 01-31\n- h - hour of the day 1-12\n- hh - hour of the day 01-12\n- t - twenty four hour of the day 1-23\n- tt - twenty four hour of the day, zero padded 01-23\n- m - minute 0-59\n- mm - minute, zero padded 00-59\n- s - second 0-59\n- ss - second, zero padded 00-59\n- fff - milliseconds\n- ffffff - microseconds\n- fffffffff - nanoseconds\n- aa - am or pm\n- AA - AM or PM\n- Z - hour and minute offset from UTC, or Z for UTC\n- ZZZ - hour and minute offset from UTC\n\nTimezone should be a location name as specified in the IANA Time Zone database, such as “America/Guayaquil” or “America/Los_Angeles”. If not specified, the current timezone will be used. An error will be returned if the timezone is not recognized.\n\nNote that fractional seconds will be parsed even without an explicit format identifier. You should only specify fractional seconds when you want to assert the number of places in the input format.\n\nparse_datetime will return an error if it is unable to convert the text to a datetime.\n\n    ```\n    @(parse_datetime(\"\"1979-07-18\"\", \"\"YYYY-MM-DD\"\")) → 1979-07-18T00:00:00.000000-05:00\n\n    @(parse_datetime(\"\"2010 5 10\"\", \"\"YYYY M DD\"\")) → 2010-05-10T00:00:00.000000-05:00\n\n    @(parse_datetime(\"\"2010 5 10 12:50\"\", \"\"YYYY M DD tt:mm\"\", \"\"America/Los_Angeles\"\")) → 2010-05-10T12:50:00.000000-07:00\n\n    @(parse_datetime(\"\"NOT DATE\"\", \"\"YYYY-MM-DD\"\")) → ERROR\n    ```\n\n### [parse_json(text)]()\n\nTries to parse text as JSON.\n\nIf the given text is not valid JSON, then an error is returned\n\n    ```\n    @(parse_json(\"\"{\\\"\"foo\\\"\": \\\"\"bar\\\"\"}\"\").foo) → bar\n\n    @(parse_json(\"\"[1,2,3,4]\"\")[2]) → 3\n\n    @(parse_json(\"\"invalid json\"\")) → ERROR\n    ```\n\n### [parse_time(text, format)]()\n\nParses text into a time using the given format.\n\nThe format string can consist of the following characters. The characters ’ ‘,’:‘,’,‘, ’T’, ‘-’ and ’\\_’ are ignored. Any other character is an error.\n\n- h - hour of the day 1-12\n- hh - hour of the day, zero padded 01-12\n- t - twenty four hour of the day 1-23\n- tt - twenty four hour of the day, zero padded 01-23\n- m - minute 0-59\n- mm - minute, zero padded 00-59\n- s - second 0-59\n- ss - second, zero padded 00-59\n- fff - milliseconds\n- ffffff - microseconds\n- fffffffff - nanoseconds\n- aa - am or pm\n- AA - AM or PM\n\nNote that fractional seconds will be parsed even without an explicit format identifier. You should only specify fractional seconds when you want to assert the number of places in the input format.\n\nparse_time will return an error if it is unable to convert the text to a time.\n\n    ```\n    @(parse_time(\"\"15:28\"\", \"\"tt:mm\"\")) → 15:28:00.000000\n\n    @(parse_time(\"\"2:40 pm\"\", \"\"h:mm aa\"\")) → 14:40:00.000000\n\n    @(parse_time(\"\"NOT TIME\"\", \"\"tt:mm\"\")) → ERROR\n    ```\n\n### [percent(number)]()\n\nFormats number as a percentage.\n\n    ```\n    @(percent(0.54234)) → 54%\n\n    @(percent(1.2)) → 120%\n\n    @(percent(\"\"foo\"\")) → ERROR\n    ```\n\n### [rand()]()\n\nReturns a single random number between [0.0-1.0).\n\n    ```\n    @(rand()) → 0.6075520156746239\n\n    @(rand()) → 0.48467757094734026\n    ```\n\n### [rand_between()]()\n\nA single random integer in the given inclusive range.\n\n    ```\n    @(rand_between(1, 10)) → 10\n\n    @(rand_between(1, 10)) → 2\n    ```\n\n### [read_chars(text)]()\n\nConverts text into something that can be read by IVR systems.\n\nReadChars will split the numbers such as they are easier to understand. This includes splitting in 3s or 4s if appropriate.\n\n    ```\n    @(read_chars(\"\"1234\"\")) → 1 2 3 4\n\n    @(read_chars(\"\"abc\"\")) → a b c\n\n    @(read_chars(\"\"abcdef\"\")) → a b c , d e f\n    ```\n\n### [regex_match(text, pattern [,group])]()\n\nReturns the first match of the regular expression pattern in text.\n\nAn optional third parameter group determines which matching group will be returned.\n\n    ```\n    @(regex_match(\"\"sda34dfddg67\"\", \"\"\\d+\"\")) → 34\n\n    @(regex_match(\"\"Bob Smith\"\", \"\"(\\w+) (\\w+)\"\", 1)) → Bob\n\n    @(regex_match(\"\"Bob Smith\"\", \"\"(\\w+) (\\w+)\"\", 2)) → Smith\n\n    @(regex_match(\"\"Bob Smith\"\", \"\"(\\w+) (\\w+)\"\", 5)) → ERROR\n\n    @(regex_match(\"\"abc\"\", \"\"[\\.\"\")) → ERROR\n    ```\n\n### [remove_first_word(text)]()\n\nRemoves the first word of text.\n\n    ```\n    @(remove_first_word(\"\"foo bar\"\")) → bar\n\n    @(remove_first_word(\"\"Hi there. I'm a flow!\"\")) → there. I'm a flow!\n    ```\n\n### [repeat(text, count)]()\n\nReturns text repeated count number of times.\n\n    ```\n    @(repeat(\"\"*\"\", 8)) → ********\n\n    @(repeat(\"\"*\"\", \"\"foo\"\")) → ERROR\n    ```\n\n### [replace(text, needle, replacement [, count])]()\n\nReplaces up to count occurrences of needle with replacement in text.\n\nIf count is omitted or is less than 0 then all occurrences are replaced.\n\n    ```\n    @(replace(\"\"foo bar foo\"\", \"\"foo\"\", \"\"zap\"\")) → zap bar zap\n\n    @(replace(\"\"foo bar foo\"\", \"\"foo\"\", \"\"zap\"\", 1)) → zap bar foo\n\n    @(replace(\"\"foo bar\"\", \"\"baz\"\", \"\"zap\"\")) → foo bar\n    ```\n\n### [replace_time(datetime)]()\n\nReturns a new datetime with the time part replaced by the time.\n\n    ```\n    @(replace_time(now(), \"\"10:30\"\")) → 2018-04-11T10:30:00.000000-05:00\n\n    @(replace_time(\"\"2017-01-15\"\", \"\"10:30\"\")) → 2017-01-15T10:30:00.000000-05:00\n\n    @(replace_time(\"\"foo\"\", \"\"10:30\"\")) → ERROR\n    ```\n\n### [reverse(array)]()\n\nReturns a new array with the values of array reversed.\n\n    ```\n    @(reverse(array(3, 1, 2))) → [2, 1, 3]\n\n    @(reverse(array(\"\"C\"\", \"\"A\"\", \"\"B\"\"))) → [B, A, C]\n    ```\n\n### [round(number [,places])]()\n\nRounds number to the nearest value.\n\nYou can optionally pass in the number of decimal places to round to as places. If places < 0, it will round the integer part to the nearest 10^(-places).\n\n    ```\n    @(round(12)) → 12\n\n    @(round(12.141)) → 12\n\n    @(round(12.6)) → 13\n\n    @(round(12.141, 2)) → 12.14\n\n    @(round(12.146, 2)) → 12.15\n\n    @(round(12.146, -1)) → 10\n\n    @(round(\"\"notnum\"\", 2)) → ERROR\n    ```\n\n### [round_down(number [,places])]()\n\nRounds number down to the nearest integer value.\n\nYou can optionally pass in the number of decimal places to round to as places.\n\n    ```\n    @(round_down(12)) → 12\n\n    @(round_down(12.141)) → 12\n\n    @(round_down(12.6)) → 12\n\n    @(round_down(12.141, 2)) → 12.14\n\n    @(round_down(12.146, 2)) → 12.14\n\n    @(round_down(\"\"foo\"\")) → ERROR\n    ```\n\n### [round_up(number [,places])]()\n\nRounds number up to the nearest integer value.\n\nYou can optionally pass in the number of decimal places to round to as places.\n\n    ```\n    @(round_up(12)) → 12\n\n    @(round_up(12.141)) → 13\n\n    @(round_up(12.6)) → 13\n\n    @(round_up(12.141, 2)) → 12.15\n\n    @(round_up(12.146, 2)) → 12.15\n\n    @(round_up(\"\"foo\"\")) → ERROR\n    ```\n\n### [sort(array)]()\n\nReturns a new array with the values of array sorted.\n\nValues in array must be a sortable type and be of the same type.\n\n    ```\n    @(sort(array(3, 1, 2))) → [1, 2, 3]\n\n    @(sort(array(\"\"C\"\", \"\"A\"\", \"\"B\"\"))) → [A, B, C]\n    ```\n\n### [split(text, [,delimiters])]()\n\nSplits text into an array of separated words.\n\nEmpty values are removed from the returned list. There is an optional final parameter delimiters which is string of characters used to split the text into words.\n\n    ```\n    @(split(\"\"a b c\"\")) → [a, b, c]\n\n    @(split(\"\"a\"\", \"\" \"\")) → [a]\n\n    @(split(\"\"abc..d\"\", \"\".\"\")) → [abc, d]\n\n    @(split(\"\"a.b.c.\"\", \"\".\"\")) → [a, b, c]\n\n    @(split(\"\"a|b,c  d\"\", \"\" .|,\"\")) → [a, b, c, d]\n    ```\n\n### [sum(array)]()\n\nSums the items in the given array.\n\n    ```\n    @(sum(array(1, 2, \"\"3\"\"))) → 6\n    ```\n\n### [text(value)]()\n\nTries to convert value to text.\n\nAn error is returned if the value can’t be converted.\n\n    ```\n    @(text(3 = 3)) → true\n\n    @(json(text(123.45))) → \"\"123.45\"\"\n\n    @(text(1 / 0)) → ERROR\n    ```\n\n### [text_compare(text1, text2)]()\n\nReturns the dictionary order of text1 and text2.\n\nThe return value will be -1 if text1 comes before text2, 0 if they are equal and 1 if text1 comes after text2.\n\n    ```\n    @(text_compare(\"\"abc\"\", \"\"abc\"\")) → 0\n\n    @(text_compare(\"\"abc\"\", \"\"def\"\")) → -1\n\n    @(text_compare(\"\"zzz\"\", \"\"aaa\"\")) → 1\n    ```\n\n### [text_length(value)]()\n\nReturns the length (number of characters) of value when converted to text.\n\n    ```\n    @(text_length(\"\"abc\"\")) → 3\n\n    @(text_length(array(2, 3))) → 6\n    ```\n\n### [text_slice(text, start [, end])]()\n\nReturns the portion of text between start (inclusive) and end (exclusive).\n\nIf end is not specified then the entire rest of text will be included. Negative values for start or end start at the end of text.\n\n    ```\n    @(text_slice(\"\"hello\"\", 2)) → llo\n\n    @(text_slice(\"\"hello\"\", 1, 3)) → el\n\n    @(text_slice(\"\"hello😁\"\", -3, -1)) → lo\n\n    @(text_slice(\"\"hello\"\", 7)) →\n    ```\n\n### [time(value)]()\n\nTries to convert value to a time.\n\nIf it is text then it will be parsed into a time using the default time format. An error is returned if the value can’t be converted.\n\n    ```\n    @(time(\"\"10:30\"\")) → 10:30:00.000000\n\n    @(time(\"\"10:30:45 PM\"\")) → 22:30:45.000000\n\n    @(time(datetime(\"\"1979-07-18T10:30:45.123456Z\"\"))) → 10:30:45.123456\n\n    @(time(\"\"what?\"\")) → ERROR\n    ```\n\n### [time_from_parts(hour, minute, second)]()\n\nCreates a time from hour, minute and second\n\n    ```\n    @(time_from_parts(14, 40, 15)) → 14:40:15.000000\n\n    @(time_from_parts(8, 10, 0)) → 08:10:00.000000\n\n    @(time_from_parts(25, 0, 0)) → ERROR\n    ```\n\n### [title(text)]()\n\nCapitalizes each word in text.\n\n    ```\n    @(title(\"\"foo\"\")) → Foo\n\n    @(title(\"\"ryan lewis\"\")) → Ryan Lewis\n\n    @(title(\"\"RYAN LEWIS\"\")) → Ryan Lewis\n\n    @(title(123)) → 123\n    ```\n\n### [today()]()\n\nReturns the current date in the environment timezone.\n\n    ```\n    @(today()) → 2018-04-11\n    ```\n\n### [trim(text, [,chars])]()\n\nRemoves whitespace from either end of text.\n\nThere is an optional final parameter chars which is string of characters to be removed instead of whitespace.\n\n    ```\n    @(trim(\"\" hello world    \"\")) → hello world\n\n    @(trim(\"\"+123157568\"\", \"\"+\"\")) → 123157568\n    ```\n\n### [trim_left(text, [,chars])]()\n\nRemoves whitespace from the start of text.\n\nThere is an optional final parameter chars which is string of characters to be removed instead of whitespace.\n\n    ```\n    @(\"\"*\"\" & trim_left(\"\" hello world   \"\") & \"\"*\"\") → *hello world   *\n\n    @(trim_left(\"\"+12345+\"\", \"\"+\"\")) → 12345+\n    ```\n\n### [trim_right(text, [,chars])]()\n\nRemoves whitespace from the end of text.\n\nThere is an optional final parameter chars which is string of characters to be removed instead of whitespace.\n\n    ```\n    @(\"\"*\"\" & trim_right(\"\" hello world   \"\") & \"\"*\"\") → * hello world*\n\n    @(trim_right(\"\"+12345+\"\", \"\"+\"\")) → +12345\n    ```\n\n### [tz(date)]()\n\nReturns the name of the timezone of date.\n\nIf no timezone information is present in the date, then the current timezone will be returned.\n\n    ```\n    @(tz(\"\"2017-01-15T02:15:18.123456Z\"\")) → UTC\n\n    @(tz(\"\"2017-01-15 02:15:18PM\"\")) → America/Guayaquil\n\n    @(tz(\"\"2017-01-15\"\")) → America/Guayaquil\n\n    @(tz(\"\"foo\"\")) → ERROR\n    ```\n\n### [tz_offset(date)]()\n\nReturns the offset of the timezone of date.\n\nThe offset is returned in the format [+/-]HH:MM. If no timezone information is present in the date, then the current timezone offset will be returned.\n\n    ```\n    @(tz_offset(\"\"2017-01-15T02:15:18.123456Z\"\")) → +0000\n\n    @(tz_offset(\"\"2017-01-15 02:15:18PM\"\")) → -0500\n\n    @(tz_offset(\"\"2017-01-15\"\")) → -0500\n\n    @(tz_offset(\"\"foo\"\")) → ERROR\n    ```\n\n### [unique(array)]()\n\nReturns the unique values in array.\n\n    ```\n    @(unique(array(1, 3, 2, 3))) → [1, 3, 2]\n\n    @(unique(array(\"\"hi\"\", \"\"there\"\", \"\"hi\"\"))) → [hi, there]\n    ```\n\n### [upper(text)]()\n\nConverts text to uppercase.\n\n    ```\n    @(upper(\"\"Asdf\"\")) → ASDF\n\n    @(upper(123)) → 123\n    ```\n\n### [url_encode(text)]()\n\nEncodes text for use as a URL parameter.\n\n    ```\n    @(url_encode(\"\"two & words\"\")) → two%20%26%20words\n\n    @(url_encode(10)) → 10\n    ```\n\n### [urn_parts(urn)]()\n\nParses a URN into its different parts\n\n    ```\n    @(urn_parts(\"\"tel:+593979012345\"\")) → {display: , path: +593979012345, scheme: tel}\n\n    @(urn_parts(\"\"twitterid:3263621177#bobby\"\")) → {display: bobby, path: 3263621177, scheme: twitterid}\n\n    @(urn_parts(\"\"not a urn\"\")) → ERROR\n    ```\n\n### [week_number(date)]()\n\nReturns the week number (1-54) of date.\n\nThe week is considered to start on Sunday and week containing Jan 1st is week number 1.\n\n    ```\n    @(week_number(\"\"2019-01-01\"\")) → 1\n\n    @(week_number(\"\"2019-07-23T16:56:59.000000Z\"\")) → 30\n\n    @(week_number(\"\"xx\"\")) → ERROR\n    ```\n\n### [weekday(date)]()\n\nReturns the day of the week for date.\n\nThe week is considered to start on Sunday so a Sunday returns 0, a Monday returns 1 etc.\n\n    ```\n    @(weekday(\"\"2017-01-15\"\")) → 0\n\n    @(weekday(\"\"foo\"\")) → ERROR\n    ```\n\n### [word(text, index [,delimiters])]()\n\nReturns the word at index in text.\n\nIndexes start at zero. There is an optional final parameter delimiters which is string of characters used to split the text into words.\n\n    ```\n    @(word(\"\"bee cat dog\"\", 0)) → bee\n\n    @(word(\"\"bee.cat,dog\"\", 0)) → bee\n\n    @(word(\"\"bee.cat,dog\"\", 1)) → cat\n\n    @(word(\"\"bee.cat,dog\"\", 2)) → dog\n\n    @(word(\"\"bee.cat,dog\"\", -1)) → dog\n\n    @(word(\"\"bee.cat,dog\"\", -2)) → cat\n\n    @(word(\"\"bee.*cat,dog\"\", 1, \"\".*=|\"\")) → cat,dog\n\n    @(word(\"\"O'Grady O'Flaggerty\"\", 1, \"\" \"\")) → O'Flaggerty\n    ```\n\n### [word_count(text [,delimiters])]()\n\nReturns the number of words in text.\n\nThere is an optional final parameter delimiters which is string of characters used to split the text into words.\n\n    ```\n    @(word_count(\"\"foo bar\"\")) → 2\n\n    @(word_count(10)) → 1\n\n    @(word_count(\"\"\"\")) → 0\n\n    @(word_count(\"\"😀😃😄😁\"\")) → 4\n\n    @(word_count(\"\"bee.*cat,dog\"\", \"\".*=|\"\")) → 2\n\n    @(word_count(\"\"O'Grady O'Flaggerty\"\", \"\" \"\")) → 2\n    ```\n\n### [word_slice(text, start, end [,delimiters])]()\n\nExtracts a sub-sequence of words from text.\n\nThe returned words are those from start up to but not-including end. Indexes start at zero and a negative end value means that all words after the start should be returned. There is an optional final parameter delimiters which is string of characters used to split the text into words.\n\n    ```\n    @(word_slice(\"\"bee cat dog\"\", 0, 1)) → bee\n\n    @(word_slice(\"\"bee cat dog\"\", 0, 2)) → bee cat\n\n    @(word_slice(\"\"bee cat dog\"\", 1, -1)) → cat dog\n\n    @(word_slice(\"\"bee cat dog\"\", 1)) → cat dog\n\n    @(word_slice(\"\"bee cat dog\"\", 2, 3)) → dog\n\n    @(word_slice(\"\"bee cat dog\"\", 3, 10)) →\n\n    @(word_slice(\"\"bee.*cat,dog\"\", 1, -1, \"\".*=|,\"\")) → cat dog\n\n    @(word_slice(\"\"O'Grady O'Flaggerty\"\", 1, 2, \"\" \"\")) → O'Flaggerty\n    ```"}