Linguagem de programação baseada em cartão postal

imagem
Fonte


Ralph Johnson, um dos membros do Gang of Four, mostrou uma vez como a sintaxe da linguagem Smalltalk-80 pode caber em um cartão postal. Agora, quase 30 anos após a primeira versão do Smalltalk, o dialeto de crescimento mais rápido do Smalltalk é o Pharo, cujo cartão postal será analisado mais adiante.


Declaração de método


exampleWithNumber: x 

Os métodos são declarados como : e são membros da classe. Um método com vários parâmetros é declarado assim


 rangeFrom: start to: end 

O nome do método é rangeFrom:to: e os nomes dos parâmetros são start e end .


Declaração pragma


 <syntaxOn: #postcard> 

Pragma é usado para anotar o método. Essa anotação pode ser usada pelo compilador ou outros métodos como metadados.


Comentários


 "A ""complete"" Pharo syntax" 

Os comentários são indicados por aspas. As aspas dentro do comentário são indicadas por aspas duplas.


Declarando uma variável local


 | y | 

Variáveis ​​locais são usadas nos cálculos dentro do método. Declarações de tipo variável não são necessárias, pois o Smalltalk é uma linguagem de tipo dinâmico.


Várias variáveis ​​são declaradas em uma lista.


 | yx totalSum | 

Objetos e Mensagens


 true & false not & (nil isNil) 

Tudo no Smalltalk é um objeto, e os objetos podem receber mensagens. A ordem de execução (ou seja, o envio de mensagens) é da esquerda para a direita, mas as mensagens sem parâmetros são enviadas principalmente de acordo com as regras de prioridade; portanto, a ordem de cálculo aqui será


 (true & (false not)) & (nil isNil) 

Existem apenas quatro regras de prioridade no Smalltalk: as primeiras mensagens são enviadas entre parênteses, depois unárias (sem parâmetros adicionais além do próprio objeto destinatário, por exemplo, false not ), depois binárias (com um parâmetro adicional, por exemplo, 1 + 2 ) e, em seguida, mensagens com vários parâmetros (por exemplo, 15 between: 1 and: 2 ). A prioridade de execução é indicada por um esquema simples.


colchetes > unário > binário > mensagens com vários parâmetros


Essas regras também se aplicam a operações matemáticas, portanto, o resultado da expressão


 1 + 15 / 4 " = (1 + 15) / 4 " 

será 4 . A propósito, nil também nil um objeto e pode receber e responder a mensagens.


Execução condicional e blocos de código


 true & false not & (nil isNil) ifFalse: [ self perform: #add: with: x ]. 

A execução condicional é implementada enviando mensagens ifTrue , ifFalse para um objeto ifFalse . O argumento desta mensagem é um bloco de código, indicado entre colchetes, que é executado se a condição especificada for atendida.


Os blocos Smalltalk também são usados ​​como funções anônimas:


 sum := [ :x :y | x+y ]. "  x,y -> x+y " sum value: 10 value: 25. "  ,  - 35" 

Enviando mensagens para si mesmo


 self perform: #add: with: x 

A palavra-chave self é usada como referência ao objeto que contém o método ao enviar mensagens para o próprio objeto. Aqui nós enviamos um perform: with: message com argumentos #add e x . O símbolo # indica uma cadeia literal, que é usada aqui como um identificador de método.


Atribuição variável


 y := thisContext stack size + super size. 

A atribuição de uma variável é indicada pelo operador := A super palavra-chave é usada para se referir a um objeto de superclasse.


Todos os objetos Smalltalk herdam da classe Object ou de sua superclasse, que, por sua vez, herda de sua superclasse ou da classe Object .


Matriz estática


 byteArray := #[2 2r100 8r20 16rFF]. 

byteArray é uma variável de instância de classe declarada quando a classe é declarada. A matriz byteArray consiste em números inteiros escritos em diferentes sistemas numéricos no formato


 <>r<> 

O tamanho das matrizes estáticas é fixo e definido em tempo de compilação. A indexação da matriz começa em 1


 byteArray at: 2 " = 2r100 " 

Desde o início, o Smalltalk não era apenas uma linguagem, mas também um ambiente de desenvolvimento integrado com sua própria máquina virtual: as classes e os métodos do Smalltalk não são armazenados em arquivos de texto separados, mas são salvos imediatamente em uma imagem de máquina virtual e declarados pela interface do ambiente de desenvolvimento. Por exemplo, o Counter classe Counter declarado na seção de classe como


 Object subclass: #Counter instanceVariableNames: 'count initialValue' classVariableNames: '' package: 'MyCounter' 

e seus métodos são declarados na seção de métodos da classe Counter .


Matriz dinâmica


 { -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } 

Uma matriz dinâmica é criada em tempo de execução.
As matrizes podem conter dados de diferentes tipos: o primeiro elemento da matriz é o número -42, o segundo elemento da matriz é uma matriz com elementos de diferentes tipos:


  • $a - o caractere "a"
  • #a #'I''m' - cadeias literais "a" e "I'm"
  • 'a' - string "a"
  • 1.0 1.23e2 - números de ponto flutuante
  • 3.14s2 - fração decimal com uma escala de 2

Ciclos


 { -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } do: [ :each | | var | var := Transcript show: each class name; show: each printString ]. 

Os loops no Smalltalk são implementados enviando uma mensagem para uma matriz com um bloco que será executado em cada elemento dessa matriz, que é muito semelhante à abordagem funcional. A cada iteração, o elemento da matriz é passado como um argumento para o bloco que executa alguns cálculos. No bloco do exemplo, a variável local var é declarada, à qual é atribuído o resultado do envio da última mensagem de exibição para o objeto de Transcript global.


Um recurso interessante do Smalltalk é a capacidade de cascatear mensagens: expressão


 Transcript show: 'A'; show: 'B'. 

exibe seqüencialmente as linhas A e B na janela do console Transcript . Isso é equivalente ao código


 Transcript show: 'A'. Transcript show: 'B'. 

mas evita a repetição do nome do objeto receptor de mensagem de transcrição. O resultado da cascata é a resposta do objeto à última mensagem.


Valor de retorno do método


 ^ x < y 

Os retornos são indicados por ^ . Nesse caso, um valor lógico é retornado - o resultado da comparação x < y .

Source: https://habr.com/ru/post/pt446578/


All Articles