Обратите внимание, что этот язык находится в стадии разработки.
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}?"
Этот пример hello_world демонстрирует одну важную концепцию в Fuzion довольно хорошо: все является функцией . Особенность - это реакция Fuzion на беспорядок, созданный классами , методами , интерфейсами и различными другими концепциями в других языках программирования. Поскольку все является функцией, программисту не нужно заботиться, и компилятор выполнит эту работу. Как вы можете видеть, можно даже получить доступ к функциям аргументов некоторых функций снаружи.
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
Этот пример реализует простой вариант алгоритма, который находит наибольшего общего делителя двух чисел. Тем не менее, это также демонстрирует одну из заметных функций Fuzion: дизайн по контракту. Указав предварительные и пост-кондиционирования для функций, проверки правильности становятся возможными.
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
Другая важная концепция в Fuzion - это концепция алгебраического эффекта - новый подход к инкапсуляции кода с побочными эффектами безопасным образом.
В приведенном выше примере был использован пользовательский эффект для реализации генератора с операцией yield . На некоторых других языках это требует, чтобы ключевое yield было предоставлено языком, но в Fuzion это может быть реализовано без языковой поддержки.
Если вы хотите поиграть с Fuzion, попробуйте интерактивный учебник.
Проверьте fuzion-lang.dev на наличие языка и проектирования реализации.
Обратите внимание, что текущий каталог не должен содержать пробелов.
git clone https://github.com/tokiwa-software/fuzion
Для систем на базе Debian Эта команда должна установить все требования:
sudo apt-get install make clang libgc1 libgc-dev openjdk-21-jdk
Эта команда должна установить все требования:
brew install bdw-gc gnu-sed make temurin llvmКроме того, вам может потребоваться обновить переменную среды вашего пути, например:
export PATH:"/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/opt/gnu-make/libexec/gnubin:$PATH"
Обратите внимание, что здание из PowerShell/CMD еще не работает.
Убедитесь, что Java/Javac и Clang находятся на вашем пути.
cd fuzion
make
Сейчас у вас должна быть папка под названием Build .
cd build
export PATH=$PWD/bin:$PATH
cd tests/rosettacode_factors_of_an_integer
fz factors
Для составления того же примера (требуется компилятор Clang C):
fz -c factors
./factors
Веселиться!