]]> ]]>
Править | Обсудить | История

Nimrod

Дата создания:
2004
Создан под влиянием:
Парадигма:
Типизация:
Принятые расширения файлов:
.nim
Реализации и версии (свернуть все | развернуть все):
Язык программирования

Nimrod — современный язык программирования, поддерживающий несколько парадигм.

Nimrod был создан в 2004 году Андреасом Рампфом (Andreas Rumpf). В дизайне языка сделан акцент на эффективность, выразительность и элегантность (именно в таком порядке).

Особенности языка:

  • генерация “родного” кода посредством компиляции в C;
  • быстрый сборщик мусора + прямая работа с памятью (указатели на память, которая должна освобождаться автоматически, и на память, которая обрабатывается вручную, различаются);
  • оптимизированный компилятор, включающий удаление неиспользуемого кода;
  • гибкий синтаксис с мощной системой макросов;
  • современная система типов с набором встроенных высокоуровневых структур данных;
  • трансляторы кода из C и Pascal в Nimrod;
  • поддержка объектно-ориентированного и функционального стилей программирования;
  • явная типизация с локальным выводом типов (тип переменной можно не задавать в явном виде, если он выводится из значения, которым она инициализируется при объявлении);
  • команды группируются в блоки при помощи отступов, как в Python;
  • программы регистронезависимы, более того, в названиях переменных и числовых константах игнорируются знаки подчеркивания.

Элементы синтаксиса:

Комментарий до конца строки #
Регистрозависимость нет
Присваивание значения переменной <varname> = <value>
Объявление переменной var <varname> : <type>
Объявление переменной с присваиванием значения var <varname> : <type> = <value>
Блок (отступы)
Определение функции proc f(arg1: type1, ..., argN: typeN): returnType = <block>
Вызов функции f(arg1, ..., argN)
Если - то if <condition>: <block>
Если - то - иначе if <condition>: <block> elif <condition>: <block> else: <block>
Бесконечный цикл while true: <loopBody>
Цикл с предусловием while <condition>: <loopBody>
Цикл for - next для диапазона целых чисел с инкрементом на 1 for i in countup(1, 10): <loopBody>
Цикл for - next для диапазона целых чисел с декрементом на 1 for i in countdown(1, 10): <loopBody>

Примеры:

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

]]>

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