Hoon é a linguagem de programação utilizada para desenvolver aplicações em Urbit. Para cumprir seu papel, Hoon tem algumas características que o tornam ideal para um projeto de sistema operacional descentralizado. Na realidade, a linguagem responsável pela arquitetura do Urbit é Nock.
Hoon existe para servir como uma linguagem mais fácil e intuitiva do que Nock, sendo então compilada para Nock.
A ideia de usar o Hoon para aplicações em Urbit foi levada tão a sério que o próprio sistema operacional Urbit (Arvo) foi escrito em Hoon.
Características do Hoon
Antes de mostrar algum código na prática, vamos falar um pouco sobre as características desta linguagem:
- Sintaxe única: Hoon tem uma sintaxe muito diferente das linguagens convencionais de programação (como Python). Ele usa uma notação baseada em árvores para representar código e dados. Esta sintaxe pode parecer estranha no início, mas foi projetada para ser simples e fácil de analisar.
- Tipagem forte: Hoon é uma linguagem com tipagem forte, ou seja, não permite que um valor seja tratado ou implicitamente convertido em outro tipo (por exemplo, tratando int como float). Isto ajuda a evitar erros e garante maior segurança e robustez no código.
- Programação funcional: Hoon segue o paradigma da programação funcional, que enfatiza a imutabilidade e a ausência de efeitos secundários. A programação funcional resulta em funções puras e evita mudanças de estado ou dados mutáveis.
- Sistema de tipos personalizado: Hoon tem seu próprio sistema de tipos chamado “substantivos”, que inclui dois tipos básicos: “átomos” e “células”. Esta abordagem simplifica a manipulação de tipos e a construção de estruturas de dados complexas.
Onde é utilizada a programação funcional?
As linguagens de programação funcional são particularmente adequadas para uma variedade de aplicações e domínios.
Algumas áreas onde as linguagens funcionais são particularmente eficazes incluem:
- Processamento e análise de dados: As linguagens funcionais são excelentes para manipulação e transformação de grandes conjuntos de dados, graças a sua ênfase em funções puras e imutabilidade. Isto também facilita a paralelização e distribuição de tarefas.
- Programação simultânea e paralela: A imutabilidade e a ausência de efeitos secundários em linguagens funcionais facilitam a gestão do estado compartilhado e evitam problemas comuns de concorrência, como condições raciais.
- Desenvolvimento de compiladores e interpretação de linguagem: A natureza recursiva e a capacidade de expressar transformações complexas com facilidade tornam as linguagens funcionais ideais para desenvolver compiladores e intérpretes.
- Programação reativa e desenvolvimento de interface de usuário (UI): As linguagens funcionais podem simplificar o desenvolvimento da interface do usuário e ajudar a gerenciar o estado da aplicação de forma mais previsível.
- Desenvolvimento de sistemas de alta performance e confiabilidade: Devido à ênfase na correção e previsibilidade, as linguagens funcionais podem ser usadas para criar sistemas críticos e de alta confiabilidade, tais como sistemas financeiros e aeroespaciais.
Hoon na prática
Para torná-lo menos abstrato, vamos mostrar algum código Hoon para que você possa ter uma melhor compreensão da sintaxe da linguagem.
Primeiro, entenda que as variáveis em Hoon não mudam. Isto significa que se uma variável foi criada com o valor 3, eu não posso posteriormente atribuir outro valor a ela. Para quem está familiarizado com Python, pense em tuples aqui.
Para adicionar dois números em Hoon:
%-
add
[1 2]
O resultado desta expressão seria 3.
Você pode testar este código em seu dojo. Basta copiar e colar cada comando em ordem, um de cada vez, pressionando ENTER antes de colocar cada novo comando. Seu dojo será assim:
Da mesma forma, poderíamos usar a mesma sintaxe para executar funções:
++add (adição)
++sub (subtração)
++mul (multiplicação)
++div (divisão inteira, sem resto)
++pow (poder ou exponenciação)
++mod (módulo, restante após divisão inteira)
++dvr (divisão inteira com o restante)
++max (máximo de dois números)
++min (mínimo de dois números)
Agora vamos criar uma função condicional que verifica se o número inserido pelo usuário é 5:
!:
=/
check-value
|*
a=@
?:
=(a 5)
"The number is 5"
"The number is not 5"
Explicando o código:
- !: =/ check-value: Isto define um nome (valor de controle) para a função que será criada. A função aceitará um argumento, que será um número.
- |* a=@: Esta linha é a assinatura da função. O |* indica que a função receberá um argumento, e o a=@ significa que o argumento a será do tipo átomo, que é um inteiro não assinado.
- ?: =(a 5): Esta linha começa com um operador ternário ?:. Este operador verifica uma condição e retorna um dos dois resultados subsequentes, dependendo se a condição é verdadeira ou falsa. A condição aqui é =(a 5), que testa se o argumento a é igual a 5. Se a condição for verdadeira, a expressão após a condição será avaliada e devolvida; caso contrário, a outra expressão será avaliada e devolvida.
- “The number is 5”: Esta é a expressão que será devolvida se a condição =(a 5) for verdadeira (isto é, se a for igual a 5).
- “The number is not 5”: Esta é a expressão que será devolvida se a condição =(a 5) for falsa (isto é, se a não for igual a 5).
Se você copiar e colar o código acima em seu Dojo, você estará criando a função de valor de controle. Agora você pode chamar esta função com um argumento para verificar o resultado, entrando em seu Dojo:
(check-value 5)
A saída deve ser “The number is 5”.
Onde aprender Hoon
Este site tem documentação e lições para os interessados em desenvolver aplicações em Urbit: https://developers.urbit.org/guides/core/hoon-school
Para saber mais sobre a plataforma Urbit, continue lendo os artigos: