Operadores de actualización
Para facilitar la actualización de varios campos de un objeto, se puede utilizar los siguientes operadores:
Objeto.{
campo
campo
...
}
Objeto:{
campo
campo
...
}
Objeto!{
campo
campo
...
}
Cuando se utiliza .{}
, los campos son públicos; con :{}
, protegidos; y con !{}
, privados.
Veamos un ejemplo ilustrativo:
self:{stack ::= [], (report, errors) = nil, (ok, failed, total) = 0}
#similar a:
:stack ::= []
:report = nil
:errors = nil
:ok = 0
:failed = 0
:total = 0
Se puede utilizar los operadores de asignación =
(variable), ::=
(constante) y .=
(propiedad), tal como los conocemos.
Por otra parte, la sintaxis de los campos es como sigue:
nombre Operador Expresión
{nombre, nombre, nombre...} Operador Expresión
(nombre, nombre, nombre...) Operador Expresión
Cuando se necesita actualizar varios campos al mismo valor, se pueden delimitar todos ellos entre paréntesis (()
).
Los dos ejemplos siguientes son iguales:
self:{(state, error, time) .= nil}
self:{state .= nil, error .= nil, time .= nil}
Si lo que necesitamos es actualizar varios campos a partir de los campos de un mismo objeto, se puede delimitar estos campos por llaves ({}
).
Ejemplo:
self:{ {state, error, time} .= obj }
#similar a
self:{state .= obj.state, error .= obj.error, time .= obj.time}
El operador devuelve el propio objeto para poder encadenarlo en la expresión en la que aparece. Vamos a ver otro ejemplo que combina, en una misma expresión, ambos operadores sobre el mismo objeto:
(w = fn(...args) = task.call(...args) end):{wrapped ::= task}.{
{id} ::= task
fmt ::= fn(fun)
task.fmt(fun)
return w
end
title ::= fn(title?)
if title == nil then
return task.title()
else
task.title(title)
return w
end
#...
}