Variáveis de uso único - alguma linguagem já as teve?

4

Um princípio que sigo é que, quando um identificador é estabelecido, deve ser um sinal para o leitor que o valor referido é de fato uma abstração que será usada mais de uma vez. Ou seja, o identificador é definido ou atribuído uma vez e o valor é lido mais de uma vez.

No entanto, existe um idioma comum pelo qual, para aumentar a legibilidade, partes de uma expressão complexa são fatoradas em variáveis. Essas variáveis serão usadas apenas uma vez, violando o princípio.

Assim, uma classe separada especial de identificador deve ser usada para indicar uma variável de uso único.

Este princípio se aplica a qualquer identificador. Então você pode ter funções de uso único, métodos de uso único, variáveis de uso único, etc.

Já houve alguma linguagem de programação que suportasse variáveis de uso único?

    
por dharmatech 12.01.2012 / 05:10
fonte

8 respostas

19

Na teoria dos tipos, as variáveis de uso único são modeladas com (uma derivada de) lógica linear . Na lógica linear, uma proposição só pode ser usada uma vez; lógica linear às vezes é vista como uma lógica de recursos . Na lógica linear, se você quiser usar A duas vezes, você precisa ter A⊗A (A e A) disponíveis; se você quiser usar A quantas vezes quiser, você precisa ter! A (“claro que é A”).

A lógica linear não entrou em muitas linguagens de programação tradicionais. É a base da tipagem de exclusividade no linguagem de programação limpa que é usada para modelar efeitos colaterais. Em Clean, uma expressão do tipo Int denota uma computação pura que produz um valor inteiro, ou seja, um cálculo que pode ser feito a qualquer momento, ou várias vezes, sem alterar o comportamento do programa. Uma expressão do tipo u:Int denota uma computação que produz um inteiro e que deve ser executada exatamente uma vez, por exemplo, porque realiza um efeito colateral.

    
por 12.01.2012 / 12:42
fonte
4

Você provavelmente deve dar uma olhada em ATS e Mercury . Ambos têm suporte para tipos lineares, embora em paradigmas diferentes.

Em particular, gostaria de acrescentar que o ATS usa tipos lineares para rastrear o uso de recursos, e isso tem implicações de desempenho e correção, por exemplo, permitindo a recuperação explícita de memória e suportando matrizes mutáveis eficientes.

Além disso, os termos de tipos lineares não são necessariamente "usados uma vez", mas eu não irei que agora (PDF).

    
por 13.01.2012 / 04:26
fonte
3

Você pode usar variáveis de classe de armazenamento automático em C desta maneira. Basta iniciar um novo bloco com {, declarar e inicializar algumas variáveis automáticas, fazer seu cálculo e, em seguida, fechar o bloco com} e todas as variáveis automáticas no bloco desaparecem. Um exemplo de algum código meu:

{
    int term = tar->array[i];
    int offset = isnegation(term) ? 41 : 0;
    int var = variable(term);
    int bx = ((var + offset) / bits_per_sigblock) % CLAUSE_SIGNATURE_SIZE;
    int shift = ((var + offset) % bits_per_sigblock) - 1;
    sp[bx] |= (signature_type)1 << shift;
}

Isso poderia ter sido inserido em uma linha de código, mas seria ilegível, até para mim!

    
por 12.01.2012 / 05:33
fonte
2
  • Haskell tem uma construção where que se ajusta à sua descrição, bem como let…in .
  • A família Lisp / Scheme tem let , letrec e let* .
  • ML também pratica let…in .
por 12.01.2012 / 05:14
fonte
2

Meu amigo Joe Groff enviou uma resposta por e-mail:

Esses são chamados de "tipos de exclusividade". A linguagem de programação Clean é uma linguagem funcional pura que constrói seu gerenciamento de efeitos colaterais sistema em torno deles. IIRC Mercury e Oz também apóiam tipos de exclusividade, e há uma extensão GHC que permite a anotação de exclusividade em Haskell O C ++ 11 também os tem na forma de referências de valor.

    
por 12.01.2012 / 19:19
fonte
1

Tecnicamente, qualquer variável fatorada será usada duas vezes: primeiro para armazenar o resultado de alguma subexpressão e depois como uma referência a esse resultado como parte da expressão maior.

Como você já experimentou a maioria dos idiomas, também suporta variáveis de uso único, no sentido de que é perfeitamente possível usar esse idioma. Existe algum tratamento específico diferente deles que você gostaria?

Eles devem ser removidos do namespace após o uso? Ou você quer apenas uma maneira de indicar "não se apegue a essa variável"? Espera-se que o primeiro seja cuidado por escopos geralmente limitados: qualquer coisa de uso único deve ser restrita a áreas bem contidas que não causarão problemas de desordem. A última possibilidade deve ser tratada por convenções de nomenclatura de variáveis ou comentários.

Há algo mais que você gostaria que acontecesse?

    
por 12.01.2012 / 05:21
fonte
0

A forma como as linguagens concatenadas ou baseadas em pilha geralmente usam valores é, na verdade, "lida uma vez", sendo a diferença, é claro, que não há variáveis, apenas valores em uma pilha.

Como você está retransmitindo na pilha a maior parte do tempo (as variáveis geralmente são evitadas) e os valores são consumidos pelas funções ("palavras") que estão sendo lidas, você precisa duplicar explicitamente os valores que você precisa para se referir mais de uma vez.

No final, isso leva a uma mudança do que é normal e qual é a exceção na maioria dos outros idiomas.

    
por 30.01.2016 / 22:32
fonte
-1

Em c / c ++ é um dos principais usos para o operador de troncos

const int color = in_the_matrix() ? red : blue;

Especialmente útil para coisas como threading / OMP, onde você precisa mostrar que uma variável não pode ser modificada por outro thread.

    
por 12.01.2012 / 05:27
fonte