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
]]>