Veuillez noter que cette langue est en cours.
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}?"
Cet exemple hello_world montre un concept important dans Fuzion très bien: tout est une fonctionnalité . Les fonctionnalités sont la réponse de Fuzion au désordre créé par les classes , les méthodes , les interfaces et divers autres concepts dans d'autres langages de programmation. Étant donné que tout est une fonctionnalité, le programmeur n'a pas besoin de s'en soucier et le compilateur fera ce travail. Comme vous pouvez le voir, il est même possible d'accéder aux fonctionnalités de l'argument d'une fonctionnalité de l'extérieur.
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
Cet exemple implémente une variante simple d'un algorithme qui trouve le plus grand diviseur commun de deux nombres. Cependant, il démontre également l'une des caractéristiques notables de Fuzion: conception par contrat. En spécifiant les limites de pré- et de post-post-conditionnement pour les fonctionnalités, les vérifications de l'exactitude sont rendues possibles.
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
Un autre concept majeur de Fuzion est celui de l' effet algébrique - une nouvelle approche pour encapsuler le code avec des effets secondaires de manière sûre.
Dans l'exemple ci-dessus, un effet personnalisé a été utilisé pour implémenter un générateur avec une opération yield . Dans certaines autres langues, cela nécessite un yield de mot-clé pour être fourni par la langue, mais dans Fuzion, cela peut être mis en œuvre sans support linguistique.
Si vous voulez jouer avec Fuzion, essayez le tutoriel interactif.
Vérifiez Fuzion-Lang.dev pour la conception du langage et de la mise en œuvre.
Notez que le répertoire actuel ne doit contenir aucun espace.
git clone https://github.com/tokiwa-software/fuzion
Pour les systèmes basés sur Debian, cette commande doit installer toutes les exigences:
sudo apt-get install make clang libgc1 libgc-dev openjdk-21-jdk
Cette commande doit installer toutes les exigences:
brew install bdw-gc gnu-sed make temurin llvmDe plus, vous devrez peut-être mettre à jour votre variable d'environnement de chemin, par exemple:
export PATH:"/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/opt/gnu-make/libexec/gnubin:$PATH"
Notez que la construction de PowerShell / CMD ne fonctionne pas encore.
Assurez-vous que Java / Javac et Clang sont sur votre chemin $.
cd fuzion
make
Vous devriez avoir un dossier appelé Build Now.
cd build
export PATH=$PWD/bin:$PATH
cd tests/rosettacode_factors_of_an_integer
fz factors
Pour compiler le même exemple (nécessite le compilateur Clang C):
fz -c factors
./factors
Amusez-vous!