]]> ]]>

SML/NJ

Реализация языка программирования ML

Standard ML of New Jersey (SML/NJ) представляет собой компилятор и среду разработки для языка программирования Standard ML. Изначально проект разрабатывался Bell Laboratories и Princeton University, но в настоящее время проект разрабатывается совместными усилиями Bell Laboratories, Lucent Technologies, Princeton University, Yale University, AT&T Research.

SML/NJ написан на Standard ML, исключая библиотеку времени исполнения, которая написана на C. В целом SML/NJ хорошо оптимизирующий, но довольно громоздкий компилятор.

SML/NJ распространяется бесплатно с исходным кодом, без каких либо гарантий.

SML/NJ является расширением базовой библиотеки SML ‘97 с добавлением некоторых структур верхнего уровня:

  • системная информация — модуль содержит информацию о системе времени исполнения, такую как тип операционной системы, поддерживает ли система многопроцессорную обработку и т.д.
  • слабые указатели — указатели, которые не в состоянии удерживать объект, если такой указатель ссылается на объект, то это еще не означает что “жив”
  • ленивые остановки — модуль, используемый для “ленивых вычислений”
  • небезопасный доступ — модуль обеспечивает небезопасный доступ к структурам данных
  • модули компилятора — SML/NJ включает структуру, которая обеспечивает управление компилятором ML

Примеры:

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");;

CamelCase:

Пример для версий SML/NJ 110.69
val text = valOf (TextIO.inputLine TextIO.stdIn);
fun capitalize s = let
  val (x::xs) = explode s
in
  implode (Char.toUpper x :: map Char.toLower xs)
end;
val result = concat (map capitalize (String.tokens (not o Char.isAlpha) text));
print (result ^ "\n");

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам