]]> ]]>

Nimrod

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

Авторский компилятор языка, созданный в 2004 году. Изначально он был написан на Free Pascal и Python, но в 2008 году он перешел на самокомпиляцию. В настоящее время (и вплоть до Nimrod 1.0.0) компилятор нестабилен, и новые версии могут быть несовместимы с предыдущими.

Компилятор кроссплатформенный и легко портируется на новые платформы. Он компилирует код в C, C++ или Objective C. В стандартную поставку входят привязки к Python, Lua, TCL, MySQL и SQLite, а также ряда фреймворков. Nimrod распространяется под GNU GPL.

Примеры:

Hello, World!:

Пример для версий Nimrod 0.8.8
echo "Hello, World!"

Факториал:

Пример для версий Nimrod 0.8.8

Используется рекурсивное вычисление факториала.

proc factorial(n: int): int64 =
  if n == 0:
    result = 1
  else:
    result = n * factorial(n - 1)

for i in countup(0,16):
  echo i, "! = ", factorial(i)

Факториал:

Пример для версий Nimrod 0.8.8

Факториал вычисляется итеративно. Отметим, что тип int64 в определении переменной факториала пропустить нельзя, иначе ее тип будет выведен как int, и переменная переполнится на 13!.

var f: int64 = 1
for i in countup(0,16):
  echo i, "! = ", f
  f = f * (i + 1)

Числа Фибоначчи:

Пример для версий Nimrod 0.8.8

Используется итеративное вычисление чисел Фибоначчи. Одним ключевым словом var можно объявить сразу несколько переменных, если эти объявления отформатированы отступами как блок. Тип переменной в объявлении можно не указывать только в том случае, если она инициализируется немедленно; Nimrod использует только локальный вывод типов, не глобальный.

for i in 1..16 — альтернативная форма записи цикла countup. & — оператор конкатенации строк, $ — преобразование числа в строку.

var
  f1 = 1
  f2 = 1
  f3: int
  res = ""
for i in 1..16:
  res = res & $f1 & ", "
  f3 = f1 + f2
  f1 = f2
  f2 = f3
echo res & "..."

Числа Фибоначчи:

Пример для версий Nimrod 0.8.8

Используется формула Бине. Добавление эпсилона перед округлением необходимо для получения правильных целых значений, т.к. округление выполняется вниз.

from math import sqrt, pow, round

proc fibonacci(n: int): int =
  var phi: float64 = (1.0 + sqrt(5.0)) / 2.0
  return round((pow(phi, float64(n)) - pow(-phi, -float64(n))) / sqrt(5.0) + 0.0001)

var res = ""
for i in 1..16:
  res = res & $fibonacci(i) & ", "
echo res & "..."

Квадратное уравнение:

Пример для версий Nimrod 0.8.8
from math import sqrt
from strutils import parseFloat

var A = parseFloat(readLine(stdin))
if A == 0.0:
  echo "Not a quadratic equation."
else:
  var B = parseFloat(readLine(stdin))
  var C = parseFloat(readLine(stdin))
  var D = B * B - 4.0 * A * C
  if D == 0.0:
    echo "x = ", -0.5 * B / A
  elif D > 0.0:
    echo "x1 = ", -0.5 * (B - sqrt(D)) / A
    echo "x2 = ", -0.5 * (B + sqrt(D)) / A
  else:
    echo "x1 = (", -0.5 * B / A, ", ",  0.5 * sqrt(-D) / A, ")"
    echo "x2 = (", -0.5 * B / A, ", ", -0.5 * sqrt(-D) / A, ")"

CamelCase:

Пример для версий Nimrod 0.8.8

Эта программа использует регулярные выражения. В Nimrod они реализованы при помощи библиотеки PRCE (Perl-Compatible Regular Expressions), написанной на C.

from strutils import toLower, capitalize, join
import re

var text = toLower(readLine(stdin))
var words = split(text, re"[^a-z]+")
echo join(words.each(capitalize))

Комментарии

]]>

blog comments powered by Disqus

]]>

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