slots
Restringir os campos de uma instância — e gastar 64% menos memória por objeto.
slots declara todos os campos que uma instância pode ter. Quem tenta criar outro é recusado:
blueprint Ponto:
slots x, y
action setup(x, y):
self.x := x
self.y := y
p := spawn Ponto(1, 2)
out p.x // imprime 1
p.z := 3 // erro: 'Ponto' has no field 'z'erro[DF0402]: 'Ponto' has no field 'z'.
= nota: it declares slots: x, y
= dica: slots list every field the object may have; add it there,
or remove the 'slots' declarationPor que isso economiza memória#
Sem slots, cada instância carrega um vault com os seus campos — e um vault guarda as chaves, a tabela de espalhamento e o espaço vago que ela precisa para não colidir. Com slots, a linguagem sabe de antemão quais campos existem e em que ordem, e guarda só os valores, numa lista.
São 64% menos memória por objeto, medido. Num programa com um milhão de instâncias, é a diferença entre caber e não caber.
Herança#
Herdar de um blueprint com slots e acrescentar os próprios é o caso normal: os campos se somam.
blueprint Ponto:
slots x, y
blueprint Ponto3D extends Ponto:
slots z
// a instância aceita x, y e z`slots` é contextual, não reservada#
O parser só a reconhece dentro de um blueprint e quando o que vem depois confirma. slots := 3 em qualquer lugar continua sendo uma variável chamada slots — pelo mesmo motivo de get, set, final e as dez palavras do Kiln: são nomes bons demais para tirar de quem escreve.