Olá, mundo!: O Seu Primeiro Programa em Pony!
Após instalar o compilador Pony, ou abrir a ferramenta Playground, vamos começar a programar! O nosso primeiro programa será um programa muito tradicional. Vamos imprimir "Hello, World!"(Olá, mundo! em inglês).
Se estiver usando o compilador em sua maquina, crie um diretório chamado "helloworld":$ mkdir helloworld
$ cd helloworld
O nome do diretório é importante? Sim, importa. É o nome do seu programa! Por padrão, quando o seu programa é compilado, o binário executável resultante terá o mesmo nome que o diretório onde o seu programa está. Também pode definir o nome usando as opções -bin-name ou -b na linha de comando.
O código
Em seguida, criar um arquivo nesse diretório chamado main.pony.
O nome do arquivo é importante? Não. O Pony não se importa com nomes de arquivos além do fato de terminarem em .pony. Mas pode ser importante para você! Ao dar bons nomes a arquivos, pode ser mais fácil encontrar mais tarde o código que procura. No seu arquivo, coloque o seguinte código:
actor Main
new create(env: Env) =>
env.out.print("Hello, world!")
Compilação do programa
Agora, vamos compilar esse codigo utilizando os seguintes comandos:
$ ponyc
Building .
Building builtin
Generating
Optimising
Writing ./helloworld.o
Linking ./helloworld
(Se estiver usando o Docker, escreva algo como $ docker run -v Some_Absolute_Path/helloworld:/src/main ponylang/ponyc
, dependendo, claro, de qual é o caminho absoluto para o seu diretório helloworld).
Montamos o diretório atual, ., mais o material que está incorporado no Pony, construiu, gerou algum código, otimizou-o, criou um arquivo objeto (não se preocupe se não souber o que é), e o vinculou a um executável com quaisquer bibliotecas que fossem necessárias. Se for um programador C/C++, tudo isso fará sentido para ti, caso contrário, provavelmente não fará, mas não faz mal, pode ignorá-lo.
Espere, também está vinculado? Sim. Não vai precisar de um sistema de construção (como o Make) para o Pony. Ele trata disso para você (incluindo o tratamento da ordem das dependências quando se vincula a bibliotecas C, mas chegaremos a isso mais tarde).
Executando o programa
Agora podemos executar o programa:
$ ./helloworld
Hello, world!
Como Funciona
Vejamos novamente o nosso código:
actor Main
new create(env: Env) =>
env.out.print("Hello, world!")
Vamos analisar linha por linha.
Linha 1
actor Main
Esta é uma declaração de tipo. A palavra-chave actor significa que vamos definir um ator, que é parecido com uma classe em Python, Java, C#, C++, etc. Pony também tem classes, o que veremos mais tarde.
A diferença entre um ator e uma classe é que um ator pode ter métodos assíncronos, chamados comportamentos. Falaremos mais sobre isso mais tarde.
Um programa Pony tem de ter um ator principal. É como que a função principal em C ou C++, ou o método principal em Java, ou o método principal em C#. É onde a ação começa.
Linha 2
new create(env: Env) =>
Este é um construtor. A palavra-chave new significa que é uma função que cria uma nova instância do tipo. Neste caso, cria um novo Main.
Ao contrário de outras linguagens, os construtores em Pony têm nomes. Isso significa que pode haver mais do que uma forma de construir uma instância do tipo. Neste caso, o nome do construtor é criado.
Os parâmetros de uma função são os seguintes. Neste caso, o nosso construtor tem um único parâmetro chamado env que é do tipo Env.
Em Pony, o tipo de algo vem sempre a seguir ao seu nome e é separado por dois pontos. Em C, C++, Java ou C#, pode-se dizer Env, mas fazemos ao contrário (como Go, Pascal, Rust, TypeScript, e um monte de outras linguagens).
Acontece que o nosso ator principal tem de ter um construtor chamado create, que toma um único parâmetro do tipo Env. É assim que todos os programas começam! Assim, o início do seu programa é essencialmente o corpo desse construtor.
Espere, o que é o corpo? É o código que vem depois do =>.
Linha 3
env.out.print("Hello, world!")
Este é o seu programa! Mas o que ele está fazendo?
Em Pony, um ponto é ou um acesso de campo ou uma chamada de método, tal como outras línguas. Se o nome depois do ponto tiver parênteses depois dele, é uma chamada de método. Caso contrário, é um acesso de campo.
Portanto, aqui, começamos com uma referência a env. Depois olhamos para o campo env do nosso objeto. Acontece que esse campo representa stdout, ou seja, normalmente significa imprimir. Em seguida, chamamos o método de impressão em env.out. As coisas dentro dos parênteses são os argumentos para a função. Neste caso, estamos a passar uma string literal, ou seja, o material entre aspas duplas.
Em Pony, os caracteres literais em cadeia podem estar entre aspas duplas, ", caso em que seguem o estilo de fuga C/C++ (usando coisas como \n), ou podem estar entre aspas triplas, """, como em Python, caso em que são considerados dados em bruto.
O que é um Env, afinal? É o "ambiente" com o qual o seu programa foi invocado. Isso significa que tem argumentos de linha de comando, variáveis de ambiente, stdin, stdout, e stderr. O Pony não tem variáveis globais, pelo que estas coisas são explicitamente transmitidas ao seu programa.