MLton
Реализация языка программирования MLMLton является реализацией диалекта Standard ML с открытым исходным кодом. MLton — это оптимизирующий компилятор, который стремится производить быстрые, компактные программы. MLton распространяется под BSD-подобной лицензией.
Разработка MLton началась в апреле 1997 и продолжается в настоящее время. Изначально этот проект возник как модернизация SML/NJ. Основными достоинствами данной реализации является поддержка множества платформ и компиляция программ в очень быстрый код.
Отметим, что MLton — только компилятор, без интерактивного интерпретатора. Допустимые расширения файлов — .c, .cm, .mlb, .o, .sml. При запуске MLton для файла .sml создается исполняемый файл с таким же названием.
Примеры:
Hello, World!:
Пример для версий MLton 20070826, Moscow ML 2.01, SML/NJ 110.69Отметим, что в Objective Caml этот код работать не будет, так как в нем не определена функция print
.
print "Hello, World!\n";
Факториал:
Пример для версий MLton 20070826, Moscow ML 2.01, SML/NJ 110.69В примере используется рекурсивное определение факториала. ^
— оператор конкатенации строк; преобразование чисел в строки выполняется в явном виде. ;;
в конце программы — сигнал для интерактивной среды, что блок программы дописан и может быть интерпретирован. Во всех реализациях возникает ошибка переполнения при вычислении 13!, и программа прерывается.
Отметим, что Int
(библиотека для работы с целыми числами) входит в базовую библиотеку Standard ML, но SML/NJ и MLton подгружают ее автоматически, а Moscow ML — нет. Чтобы эта программа заработала в Moscow ML, ее следует запускать с опцией -P full
.
fun factorial n =
if n <= 0 then 1
else n * factorial (n-1)
val n = ref 0;
while !n <= 16 do (
print (Int.toString (!n) ^ "! = " ^ Int.toString (factorial (!n)) ^ "\n");
n := !n + 1
);;
Числа Фибоначчи:
Пример для версий MLton 20070826, Moscow ML 2.01, SML/NJ 110.69Используется итеративное определение чисел Фибоначчи.
val n = ref 0;
val fib0 = ref 1;
val fib1 = ref 1;
val sum = ref 0;
val res = ref "";
while !n <= 15 do (
res := !res ^ (Int.toString(!fib0) ^ ", ");
sum := !fib0 + !fib1;
fib0 := !fib1;
fib1 := !sum;
n := !n + 1
);
print (!res ^ "...\n");;
Комментарии
]]>blog comments powered by Disqus
]]>