CSML updates
CSML updates

CSML v1.8.0 is out!




We have just released CSML v1.8.0! This new version is PACKED with super useful features that we are extremely happy to finally share with you today. Let's do a quick roundup of all the new stuff!

while loops

This one is certainly one of the most requested features of all times, and for good reasons. You can now use standard while loops to iterate over any type of data (and not just arrays as was previously possible using foreach):

do i = 0
while (i < 3) {
  say "i = {{i}}"
  do i = i + 1

string.replace() helpers

Another very useful feature that makes it trivial to replace part of a string with something else, which was previously quite hard to achieve in pure CSML, the .replace() family of string methods (which include replace, replace_all and replace_regex) are also part of this release.

// .replace() will only replace the first occurrence
// of the first term with the second term
say "My dog Bark is nice, but my other dog Groot is mean".replace("dog", "cat") 
// => "My cat Bark is nice, but my other dog Groot is mean"

// .replace_all() will replace all occurrences
say "My dog Bark is nice, but my other dog Groot is mean".replace_all("dog", "cat") 
// => "My cat Bark is nice, but my other cat Groot is mean"

// .replace_regex() uses regular expressions 
say "My dog Bark is nice, but my other dog Groot is mean".replace_regex("[a-gA-G]", "%")
// => "My %o% %%rk is ni%%, %ut my oth%r %o% %root is m%%n"

Compound assignment operators

Yes, that's the name of the operator that lets you perform an operation at the same time that it assigns the result. For example:

do i = 1
do i += 5
say "i = {{i}}" // i = 6

Concatenate strings with the + sign

One of the feedbacks we sometimes had was that it is not always easy to concatenate strings together. It has always been possible using string interpolation, but the syntax is not too easy:

do firstname = "John"
do food = "cheese"
say "{{firstname}} likes {{food}}"

You can now use the + sign to do the same thing:

say firstname + " likes " + food

Add and subtract time from a Time() value

Obviously, one of the most common needs when manipulating times is to add or subtract time, for example when comparing two dates. The .add() and .sub() methods do exactly that:

do t1 = Time() // now
do t2 = t1.add(3600) // in 1 hour
do t3 = t1.sub(86400) // 1 day ago

Get local flow context in conversation

The _metadata global variable now has a new read-only inner property _context, which contains information about the user's current whereabouts in the flow. This object contains 2 new properties current_flow and current_step, and 2 optional properties previous_flow and previous_step that are only set when the user comes from a different step or flow (i.e after a goto).

  say "{{_metadata._context}}" // will only print `current_*` properties
  goto step1

  say "{{_metadata._context}}" // will print all 4 properties
  goto end

Check if a variable has been set with Exists("var")

Last one for today: we have introduced a new built-in function to check if a variable currently exists in the bot's memory. This is useful for checking not only if the value is a null/false/empty value, but if it exists at all!

remember myVar = "somevalue"
do Exists("myVar") // true
remember myVar = null
do Exists("myVar") // true
forget myVar
do Exists("myVar") // false

The team has been busy making a lot of other improvements and features that may also interest you, so make sure to check the release notes, and please visit our Slack if you have any questions!