Harap dicatat bahwa bahasa ini sedang dalam proses.
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}?"
Contoh hello_world ini menunjukkan satu konsep penting di Fuzion dengan cukup baik: semuanya adalah fitur . Fitur adalah respons Fuzion terhadap kekacauan yang dibuat oleh kelas , metode , antarmuka , dan berbagai konsep lainnya dalam bahasa pemrograman lainnya. Karena semuanya adalah fitur, programmer tidak perlu peduli dan kompiler akan melakukan pekerjaan ini. Seperti yang Anda lihat, bahkan mungkin untuk mengakses fitur argumen dari beberapa fitur dari luar.
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
Contoh ini mengimplementasikan varian sederhana dari suatu algoritma yang menemukan pembagi umum terbesar dari dua angka. Namun, ini juga menunjukkan salah satu fitur penting Fuzion: desain berdasarkan kontrak. Dengan menentukan pra dan postkondisi untuk fitur, pemeriksaan kebenaran dimungkinkan.
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
Konsep utama lainnya dalam Fuzion adalah efek aljabar - pendekatan baru untuk merangkum kode dengan efek samping dengan cara yang aman.
Dalam contoh di atas, efek khusus telah digunakan untuk mengimplementasikan generator dengan operasi yield . Dalam beberapa bahasa lain, ini membutuhkan yield kata kunci untuk disediakan oleh bahasa, tetapi di Fuzion ini dapat diimplementasikan tanpa dukungan bahasa.
Jika Anda ingin bermain -main dengan Fuzion, coba tutorial interaktif.
Periksa fuzion-lang.dev untuk desain bahasa dan implementasi.
Perhatikan bahwa direktori saat ini tidak boleh berisi spasi apa pun.
git clone https://github.com/tokiwa-software/fuzion
Untuk sistem berbasis Debian, perintah ini harus menginstal semua persyaratan:
sudo apt-get install make clang libgc1 libgc-dev openjdk-21-jdk
Perintah ini harus menginstal semua persyaratan:
brew install bdw-gc gnu-sed make temurin llvmSelain itu, Anda mungkin perlu memperbarui variabel lingkungan jalur Anda misalnya:
export PATH:"/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/opt/gnu-make/libexec/gnubin:$PATH"
Perhatikan bahwa bangunan dari PowerShell/CMD belum berfungsi.
Pastikan Java/Javac dan Clang berada di jalur $ Anda.
cd fuzion
make
Anda harus memiliki folder yang disebut build sekarang.
cd build
export PATH=$PWD/bin:$PATH
cd tests/rosettacode_factors_of_an_integer
fz factors
Untuk mengkompilasi contoh yang sama (membutuhkan kompiler dentang c):
fz -c factors
./factors
Selamat bersenang-senang!