Comportamento de @

Comportamento de @

> Tutorial LeekScript

Esta página é válida apenas para LS1, em LS2 e mais você não deve mais usar @

No Leekscript, caso você ainda não tenha percebido, existe um limite de operações por turno que é de 20 milhões. A otimização é, portanto, a chave para a vitória. Este artigo entrará em detalhes sobre o comportamento do '@', que é uma ferramenta muito popular.

Seu principal uso é próximo a referências, ou seja, evita-se cópias de valor.

Explicação condensada

A explicação a seguir serve para dar uma ideia do mecanismo por trás do sinal de arroba. Não constitui uma descrição técnica exata porque as fontes da versão do LeekScript atualmente usada não estão disponíveis.

0; ""; []; função(x) { return x; };

Atribuição

Quando você cria um objeto diretamente usando um literal (veja acima), ele ocupa espaço na memória. Para poder usá-lo, você precisa saber onde encontrá-lo. Chamaremos essa posição de endereço do objeto. Quando você atribui um objeto a uma variável, é feita uma cópia desse objeto e, em seguida, o endereço é fornecido à variável. Em vez de fornecer o endereço de uma cópia, podemos solicitar que o endereço do objeto original seja usado, a fim de evitar uma cópia, prefixando a expressão à direita com o sinal de igual de arroba. (left_hand=@right_hand)

var w = 0; // Uma cópia de 0 é feita e o endereço desta cópia é fornecido. var x =@ 0; // O endereço de 0 é fornecido. (Cada literal no código é um objeto diferente.) deixe y = w; // Uma cópia da cópia de 0 é feita e o endereço dessa cópia é fornecido. var z =@w; // O endereço da cópia de 0 é fornecido.

O sinal de arroba é aplicado com a precedência mais alta. Então x=@y+z não fará o que você pode ter imaginado. A expressão equivalente é x = (@x) + y. Se você deseja atribuir o endereço, precisará adicionar parênteses para especificar a que se aplica o sinal de arroba: x =@ (x + y).

Casos especiais

--- Operações em números não são mutantes. Quando você usa operadores como +=, o resultado é um novo objeto. Isso difere de arrays e strings de caracteres porque os dois últimos são estruturas e é seu conteúdo que é modificado. Para ficar um pouco mais fácil de entender como isso funciona, ajuda a expandir um pouco as expressões. x += 1 torna-se x = x + 1, notamos que há reatribuição. Considerando que x += [1] torna-se x[count(x)] = 1 ou push(x, 1)/pushAll(x, [1]); é claro que a variável x não é reatribuída.

Contexto

Da mesma forma, quando você passa um objeto como argumento para uma função, uma cópia é feita e o endereço dessa cópia é dado ao parâmetro. No entanto, ao contrário da atribuição a uma variável, prefixar um parâmetro com um sinal de arroba tem um comportamento um pouco mais complexo ao aplicar a função:

No caso raro de você querer passar uma cópia ao invés do endereço da variável, você pode prefixar o argumento com um sinal de arroba: at(@zero).

No parâmetro

Seu uso mais estável e prático é nos parâmetros de uma função:

função with_a (@ param1 ) { } // Com o qual vamos confrontar: função sem_a (param1) { }

Nota: Se você modificar o parâmetro na função, esta modificação também ocorrerá na variável do programa chamador, pois o valor informado é sua variável, não o valor dela, por exemplo:

função add_1 (@param) { parâmetro += 1; }

seja a = 5; add_1(a); depurar(a); // exibe: '6'

Nota: Chamar uma função custa 1 operação. Este custo foi deduzido dos seguintes resultados.

Passando por dados brutos Passando por uma variável Dados passados como parâmetro sem o '@' com o '@' custo de atribuição à variável (cf Assignment) sem o ' @ ' com '@' 42 2 1 2 2 0 "uma string" 2 1 2 2 0 função () {} 2 1 2 2 0 [42, -42, 42] 116 34 116 83 0 ["