Observe que esse idioma está em andamento.
hello_world is
# first we define a custom mutate effect.
# we will need this for buffered reading from stdin
#
lm : mutate is
# calling `lm` creates an instance of our mutate effect,
# `instate_self` is then used to instate this instance and
# run code in the context of the instated effect.
#
lm ! ()->
# read someone's name from standard input
#
get_name =>
(io.stdin lm) ! ()->
io.buffered.read_line lm ? str String => str | io.end_of_file => ""
# greet someone with the name given
#
greet(name String) is
say "Hello, {name}!"
# greet the user
#
x := greet get_name
# you can access any feature - even argument features of other features
# from outside
#
say "How are you, {x.name}?"
Este exemplo hello_world demonstra um conceito importante em Fuzion muito bem: tudo é um recurso . Os recursos são a resposta de Fuzion à bagunça criada por classes , métodos , interfaces e vários outros conceitos em outras linguagens de programação. Como tudo é um recurso, o programador não precisa se importar e o compilador fará esse trabalho. Como você pode ver, é até possível acessar os recursos de argumento de algum recurso de fora.
ex_gcd is
# return common divisors of a and b
#
common_divisors_of(a, b i32) =>
max := max a.abs b.abs
(1..max).flat_map i32 i->
if (a % i = 0) && (b % i = 0)
[-i, i]
else
[]
# find the greatest common divisor of a and b
#
gcd(a, b i32)
pre
safety: (a != 0 || b != 0)
post
safety: a % result = 0
safety: b % result = 0
pedantic: (common_divisors_of a b).reduce bool true (acc,cur -> acc && (result % cur = 0))
=>
if b = 0 then a else gcd b (a % b)
say <| gcd 8 12
say <| gcd -8 12
say <| gcd 28 0
Este exemplo implementa uma variante simples de um algoritmo que encontra o maior divisor comum de dois números. No entanto, também demonstra um dos recursos notáveis de Fuzion: design por contrato. Ao especificar condições pré e pós-pós-recursos, as verificações de correção são possíveis.
generator_effect is
# define a generator effect with a yield operation
#
gen(T type,
yield T->unit # yield is called by code to yield values
) : effect is
# traverse a list and yield the elements
#
list.traverse unit =>
match list.this
c Cons => (generator_effect.gen A).env.yield c.head; c.tail.traverse
nil =>
# bind the yield operation dynamically
#
(gen i32 (i -> say "yielded $i")) ! ()->
[0,8,15].as_list.traverse
Outro conceito importante em Fuzion é o do efeito algébrico - uma nova abordagem para encapsular o código com efeitos colaterais de uma maneira segura.
No exemplo acima, um efeito personalizado foi usado para implementar um gerador com uma operação yield . Em alguns outros idiomas, isso exige que um yield de palavras -chave seja fornecido pelo idioma, mas no Fuzion isso pode ser implementado sem suporte ao idioma.
Se você quiser brincar com Fuzion, tente o tutorial interativo.
Verifique o Fuzion-Lang.dev para obter o design de idiomas e implementação.
Observe que o diretório atual não deve conter espaços.
git clone https://github.com/tokiwa-software/fuzion
Para sistemas baseados em Debian, este comando deve instalar todos os requisitos:
sudo apt-get install make clang libgc1 libgc-dev openjdk-21-jdk
Este comando deve instalar todos os requisitos:
brew install bdw-gc gnu-sed make temurin llvmAlém disso, pode ser necessário atualizar sua variável de ambiente de caminho, por exemplo:
export PATH:"/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/opt/gnu-make/libexec/gnubin:$PATH"
Observe que o edifício da PowerShell/CMD ainda não funciona.
Verifique se Java/Javac e Clang estão no seu $ Path.
cd fuzion
make
Você deve ter uma pasta chamada Build agora.
cd build
export PATH=$PWD/bin:$PATH
cd tests/rosettacode_factors_of_an_integer
fz factors
Para compilar o mesmo exemplo (requer o compilador Clang C):
fz -c factors
./factors
Divirta-se!