Bitte beachten Sie, dass diese Sprache in Arbeit ist.
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}?"
Dieses Beispiel hello_world zeigt ein wichtiges Konzept in Fuzion ganz gut: Alles ist ein Merkmal . Merkmale sind Fuzions Reaktion auf das Chaos, das durch Klassen , Methoden , Schnittstellen und verschiedene andere Konzepte in anderen Programmiersprachen erstellt wird. Da alles eine Funktion ist, muss der Programmierer nicht darum sorgen, und der Compiler wird diese Arbeit erledigen. Wie Sie sehen können, ist es sogar möglich, von außen auf die Argumentationsfunktionen einiger Funktionen zuzugreifen.
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
Dieses Beispiel implementiert eine einfache Variante eines Algorithmus, der den größten gemeinsamen Teil der zwei Zahlen findet. Es zeigt jedoch auch eine der bemerkenswerten Funktionen von Fuzion: Design für Vertrag. Durch Angeben von Vor- und Nachschlägen für Funktionen werden Korrektheitsprüfungen ermöglicht.
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
Ein weiteres Hauptkonzept in Fuzion ist das des algebraischen Effekts - ein neuer Ansatz zur Einkapselung von Code mit Nebenwirkungen auf sichere Weise.
Im obigen Beispiel wurde ein benutzerdefinierter Effekt verwendet, um einen Generator mit einem yield zu implementieren. In einigen anderen Sprachen erfordert dies eine von der Sprache bereitgestellte yield . In Fuzion kann dies jedoch ohne Sprachunterstützung implementiert werden.
Wenn Sie mit Fuzion herumspielen möchten, probieren Sie das interaktive Tutorial.
Überprüfen Sie Fuzion-Lang.dev auf Sprach- und Implementierungsdesign.
Beachten Sie, dass das aktuelle Verzeichnis keine Räume enthalten darf.
git clone https://github.com/tokiwa-software/fuzion
Für Debian -basierte Systeme sollte dieser Befehl alle Anforderungen installieren:
sudo apt-get install make clang libgc1 libgc-dev openjdk-21-jdk
Dieser Befehl sollte alle Anforderungen installieren:
brew install bdw-gc gnu-sed make temurin llvmDarüber hinaus müssen Sie möglicherweise Ihre Pfadumgebungsvariable aktualisieren, z.
export PATH:"/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/opt/gnu-make/libexec/gnubin:$PATH"
Beachten Sie, dass das Gebäude von PowerShell/CMD noch nicht funktioniert.
Stellen Sie sicher, dass Java/Javac und Clang in Ihrem $ -Path sind.
cd fuzion
make
Sie sollten jetzt einen Ordner namens Build haben.
cd build
export PATH=$PWD/bin:$PATH
cd tests/rosettacode_factors_of_an_integer
fz factors
Um dasselbe Beispiel zu kompilieren (erfordert Clang C Compiler):
fz -c factors
./factors
Viel Spaß!