A distinção entre expressões primitivas, meios de combinação e meios de abstração é útil na modelagem de linguagens de programação. Observe que isso não é uma propriedade intrínseca do idioma: você não pode apontar para nenhuma definição de idioma e dizer "esse recurso é inequivocamente uma expressão primitiva, esse recurso é inequivocamente um meio de combinação". A distinção é uma propriedade do modelo, e modelos complexos podem resistir à classificação.
Um exemplo de livro didático desses três conceitos é o cálculo lambda , que possui exatamente um de cada:
- Variáveis x , y ,… são as únicas expressões primitivas.
- A aplicação de função MN é o único meio de combinação.
- Abstração lambda λx.M é o único meio de abstração.
Quando você acessa idiomas com mais recursos, a modelagem pode se tornar mais ambígua. De um modo geral, uma expressão primitiva é aquela que você não pode ou não decompõe em componentes primitivos. Mas é como o átomo : é primitivo até a ciência avançar. Por exemplo, existe uma variante do cálculo lambda em que variáveis usam números em vez de nomes ( índices de Bruijn ), o que é particularmente conveniente ao modelar termos lambda para provas de computador; e nas provas de computador, os números inteiros são divididos em partes constituintes . Portanto, nesses modelos, as variáveis não são expressões primitivas, afinal.
Em (um modelo típico de) Java, expressões primitivas são principalmente constantes e variáveis. Os meios de combinação incluem os numerosos operadores; mais precisamente, "expressão aditiva" é um meio de combinação com dois slots (o lado esquerdo e o lado direito) ou com três slots (os dois lados e o operador) se você incluir A +
B e A -
B sob esse nome (nesse caso, os operadores +
e -
seriam construções primitivas por direito próprio). Outros meios de combinação incluem sequências da instrução I ;
J , construções de loopwhile (…) {…}
, e assim por diante. Então você tem construções como declarações de variáveis, definições de funções, definições de classe e assim por diante, que são ambos meios de combinações (eles combinam nomes e tipos de parâmetros, corpos, inicializadores ...) e meios de abstração (porque definem nomes para reutilização). De fato, é bastante comum que meios de abstração também sejam meios de combinação: eles combinam um nome com sua definição.