Expressions such as

j = j + 2

in which the left hand side is repeated on the right can be written in the compressed form

j += 2

SPL supports several assignment operators:

Operator |
Description |

+= |
add then assign |

-= |
subtract then assign |

*= |
multiply then assign |

/= |
divide then assign |

%= |
modulo then assign |

>>= |
bit right shift then assign |

<<= |
bit left shift then assign |

&= |
bit and then assign |

|= |
bit or then assign |

|^= |
bit xor and assign |

@= |
append then assign |

@@ |
concatenate |

If e1 and e2 are expressions, then

e1 op= e2

is equivalent to

e1 = (e1) op (e2)

except that e1 is computed only once. Notice the parenthesis.

x *= y + 1

is equivalent to

x = x * (y + 1)

not

x = x * y + 1

Assignment operators are not only fast and concise, they correspond better to the way people think. We say "add 2 to j" or "increment j by 2," not "take j, add 2, then put the result back into j." Thus, j += 2.

The statement:

a = b @@ c

is more compact and equivalent to

a = concat(b, c)

The statement:

a @= b

is equivalent to

append(a, b)

The @= operator appends the series B to the end of series A in place. a @= b is much faster than a = a @@ b for large series because @= operates on the existing series whereas @@ creates and assigns a new series.