Uma linguagem de inspiração funcional focada em expressividade.
iex (irm https://bern-lang.github.io/Bern/install/install_bern.ps1)
Instale com PowerShell usando o comando acima.
Como alternativa, instale com Bash usando curl -fsSL https://bern-lang.github.io/Bern/install/install_bern.sh | bash
A biblioteca padrão oferece um conjunto rico de funções para manipulação de dados, E/S e muito mais, para você começar rapidamente.
import core
import random
import strings
-- Esta é de fato uma função 'random' que envolve um binding em C!
text = random_choice(['apple', 'banana', 'cherry'])
map(text, \c -> char_to_upper(c))
Defina funções com várias cláusulas que casam padrões, deixando seu código claro e fácil de manter.
def sign(0) -> "zero"
def sign(n) -> "positive"
def greet("Alice") -> "Hi, Alice!"
def greet(_) -> "Hello, someone else!"Crie tipos personalizados com vários construtores para modelar dados com segurança de tipos. ADTs combinam naturalmente com casamento de padrões.
adt Shape = Circle Double | Rectangle Double Double
def area(Circle(r)) -> 3.14159 * r * r
def area(Rectangle(w, h)) -> w * h
c = Circle(5.0)
r = Rectangle(3.0, 4.0)
area(c) // Calcula a área do círculo
Use a palavra-chave loop para todos os tipos de laço, inspirada em Odin. Sintaxe limpa para laços de repetição, condicionais e de iteração. (for ainda funciona como sinônimo.)
// Laço de repetição
loop 3 do
"Hello!"
end
// Laço condicional
loop counter > 0 do
counter = counter - 1
end
// Laço loop-in
loop char : "Bern" do
char
end
Funções são valores que podem ser passados adiante, retornados e compostos. Expressões lambda tornam funções em linha algo natural.
import core
// Uso de função de ordem superior
map([1, 2, 3, 4, 5], \x -> x * 2)
// Expressões lambda
inc = \x -> x + 1
applyTwice(\n -> n * 2, 5)
O operador )| encaminha um valor para uma função como seu primeiro argumento, então as transformações de dados são lidas da esquerda para a direita.
import core
// x )| f é o mesmo que f(x)
[1, 2, 3, 4] )| filter(\x -> x % 2 == 0) )| map(\x -> x * 10)
// [20, 40]É novo na programação? Você não precisa decorar símbolos enigmáticos. Todo operador tem um nome em palavras simples, então você escreve o que quer dizer e lê seu código em voz alta. Quando estiver à vontade, os símbolos também funcionam, e você pode misturar os dois livremente.
3 is-greater 2 and 5 is-less-or-equal 5 // true
[1, 2] concat [3, 4] // [1, 2, 3, 4]
total be 10 plus 5 // atribuição com palavras
17 modulo 5 // 2[1..10] para listas<>, <|, |>, </> para listas e conjuntos#{key: value}#:>(length) e ::(typeof)write_file(), read_file() e get_host_machine())Uma amostra rápida abaixo. Para um passo a passo guiado e detalhadamente explicado de cada recurso, vá para a página de Exemplos aprofundada →
Em Bern, literais são interpretados e impressos automaticamente. Variáveis são definidas com uma atribuição simples.
Use instruções if-then-else e cadeias else-if para lógica condicional.
Listas são coleções homogêneas com sintaxe de intervalo e diversas operações.
Conjuntos cuidam da unicidade automaticamente e oferecem operações da teoria dos conjuntos.
Objetos usam a notação #{...}# para pares chave-valor.
Use blocos do...end com return para funções mais complexas.
Estenda funcionalidades importando bibliotecas como core.
O operador )| passa um valor como primeiro argumento para uma função, deixando os encadeamentos serem lidos da esquerda para a direita.
Capture a entrada do usuário com a função input().