Tenga en cuenta que este idioma es trabajo en progreso.
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 ejemplo hello_world demuestra un concepto importante en Fuzion bastante bien: todo es una característica . Las características son la respuesta de Fuzion al desastre creado por clases , métodos , interfaces y varios otros conceptos en otros lenguajes de programación. Dado que todo es una característica, el programador no necesita preocuparse y el compilador hará este trabajo. Como puede ver, incluso es posible acceder a las características del argumento de alguna característica desde el exterior.
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 ejemplo implementa una variante simple de un algoritmo que encuentra el mayor divisor común de dos números. Sin embargo, también demuestra una de las características notables de Fuzion: diseño por contrato. Al especificar las funciones previas y posteriores a las características, las verificaciones de corrección son posibles.
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
Otro concepto importante en Fuzion es el del efecto algebraico : un nuevo enfoque para encapsular el código con efectos secundarios de una manera segura.
En el ejemplo anterior, se ha utilizado un efecto personalizado para implementar un generador con una operación yield . En algunos otros idiomas, esto requiere un yield de palabra clave para ser proporcionado por el idioma, pero en Fuzion esto se puede implementar sin soporte de idioma.
Si quieres jugar con Fuzion, prueba el tutorial interactivo.
Verifique Fuzion-Lang.dev para el diseño de lenguaje e implementación.
Tenga en cuenta que el directorio actual no debe contener ningún espacio.
git clone https://github.com/tokiwa-software/fuzion
Para los sistemas basados en Debian, este comando debe instalar todos los requisitos:
sudo apt-get install make clang libgc1 libgc-dev openjdk-21-jdk
Este comando debe instalar todos los requisitos:
brew install bdw-gc gnu-sed make temurin llvmAdemás, es posible que deba actualizar su variable de entorno de ruta, por ejemplo, EG:
export PATH:"/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/opt/gnu-make/libexec/gnubin:$PATH"
Tenga en cuenta que la construcción de PowerShell/CMD aún no funciona.
Asegúrese de que Java/Javac y Clang estén en su camino $.
cd fuzion
make
Deberías tener una carpeta llamada construcción ahora.
cd build
export PATH=$PWD/bin:$PATH
cd tests/rosettacode_factors_of_an_integer
fz factors
Para compilar el mismo ejemplo (requiere el compilador de clang c):
fz -c factors
./factors
¡Divertirse!