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.8echo "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.8from 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
]]>