# Upgrading from ABS 1 to 2
It's not always possible to release backwards compatible changes, and ABS is no exception to the rule: luckily, the major upgrade between version 1 and 2 should be extremely painless as there have been no syntax changes, but rather just a handful of function changes.
# Deprecated functions
- the
slice
function you could use on arrays and strings has been removed. Use the index notation instead:[1, 2, 3].slice(0, 1)
is equivalent to[1, 2, 3][0:1]
- the
contains
function you could use on arrays and strings has been removed. Use thein
operator instead:[1, 2, 3].contains(1)
is equivalent to1 in [1, 2, 3]
# Misc
The structure for decorators had to be slighly changed to allow substantial improvements (ABS 2's decorators are 100% aligned with Python's decorators which are extremely powerful).
Earlier, a decorator function would be declared as:
f log_if_slow(original_fn, treshold_ms) {
return f() {
start = `date +%s%3N`.int()
res = original_fn(...)
end = `date +%s%3N`.int()
if end - start > treshold_ms {
echo("mmm, we were pretty slow...")
}
return res
}
}
@log_if_slow(500)
f my_func() {
...
}
In ABS 2, a decorator must evaluate to a function that accepts the original function and returns a new one with the "enhanced" behaviour. It's probably easier to see it in action:
f log_if_slow(treshold_ms) {
return f(original_fn) {
return f() {
start = `date +%s%3N`.int()
res = original_fn(...)
end = `date +%s%3N`.int()
if end - start > treshold_ms {
echo("mmm, we were pretty slow...")
}
return res
}
}
}
@log_if_slow(500)
f my_func() {
...
}
As you can see there are 2 main differences:
- the arguments to the decorator don't start with the original function anymore
- there's an additional wrapping function, accepting the original function, in the decorator
# What more?
That's really it: upgrading to ABS 2 should be an extremely painless process!