Python-nahe Syntax mit der Geschwindigkeit von C
Ausführen: Datei hallo.nim speichern und mit nim c -r hallo.nim übersetzen und starten (Nim von nim-lang.org, Paketmanager nimble).
let (unveränderlich), var (veränderlich), const (Übersetzungszeit)div/mod für Ganzzahlen, / liefert Fließkommazahlennim c -r hallo.nim # übersetzen und sofort ausführen
nim c -d:release hallo.nim # optimiert übersetzen
nim js hallo.nim # nach JavaScript
nim check hallo.nim # nur prüfen
nimble init projekt # neues Projekt
nimble install <paket> # Paket installieren
nimble test # Tests ausführenif/elif/else, case und when verzweigenfor i in 1..5, countdown, while, block mit Labelproc definiert Prozeduren (letzter Ausdruck = Rückgabe), func ist rein, template/macro erweitern die Sprache+, $) sind möglichlet n = 15
if n mod 15 == 0:
echo "FizzBuzz"
elif n mod 3 == 0:
echo "Fizz"
else:
echo n
let status = if n > 10: "groß" else: "klein"
echo status
let note = 2
case note
of 1: echo "sehr gut"
of 2, 3: echo "gut bis befriedigend"
of 4..5: echo "ausreichend bis mangelhaft"
else: echo "ungültig"
let text = case n
of 0: "null"
of 1..9: "einstellig"
else: "größer"
echo text
when defined(linux):
echo "läuft unter Linux"
else:
echo "anderes System"array (fest), seq (dynamisch, @[...]), Table, HashSet, set[...] und Tupelsequtils und sugar liefern map, filter, foldl, mapIt, filterIta[^1] zählt vom Ende, a[1..3] ist ein AusschnittTable/CountTable für Zuordnungen, toTable, getOrDefault, mgetOrPutimport std/[sequtils, algorithm, sugar]
var a: array[5, int] = [5, 3, 9, 1, 7]
echo a, " ", a.len, " ", a[0], " ", a[^1]
a[0] = 50
echo a.sorted()
var s = @[5, 3, 9, 1, 7]
s.add(11)
s.insert(100, 0)
echo s
echo s.len, " ", s[1], " ", s[^1], " ", s[1..3], " ", s[1 ..< 3]
echo s.pop()
s.delete(0)
echo s
echo s.sorted()
echo s.sorted(Descending)
echo s.reversed()
echo s.map(x => x * 2)
echo s.filter(x => x > 4)
echo s.foldl(a + b)
echo s.mapIt(it * it)
echo s.filterIt(it mod 2 == 1)
echo s.anyIt(it > 8), " ", s.allIt(it > 0)
echo s.count(3), " ", s.find(9), " ", 9 in s, " ", 99 notin s
echo s.minIndex, " ", s.maxIndex
echo s.zip(@["a", "b", "c", "d", "e"])
echo toSeq(1..5)
echo newSeq[int](3)
echo repeat(7, 3)
echo concat(@[1, 2], @[3])
echo deduplicate(@[1, 2, 2, 3, 3, 3])
echo @[1, 2, 3, 4, 5, 6].distribute(3)
echo (@[1, 2, 3] & @[4])
echo s.mapIt($it).foldl(a & "-" & b)object (Wert), ref object (Referenz) und object of RootObj für Vererbungmethod ermöglicht dynamischen Aufruf; proc wird statisch aufgelöstcase art: FormArt) modellieren Summentypen[T]) schreiben Typen und Prozeduren einmal für viele Typentype
Person = object
name: string
alter: int
Konto = ref object
inhaber: string
stand: float
proc vorstellen(p: Person): string =
p.name & " (" & $p.alter & ")"
proc einzahlen(k: Konto, betrag: float) =
k.stand += betrag
var p = Person(name: "Mia", alter: 17)
let q = p # Kopie
p.alter = 18
echo vorstellen(p), " ", vorstellen(q)
echo p.vorstellen
let k = Konto(inhaber: "Mia", stand: 10.0)
let k2 = k # gleiche Referenz
k.einzahlen(5.5)
echo k2.stand
echo p
echo k[]strutils und strformat liefern Textfunktionen und fmt"..."/&"..."readFile, writeFile, lines, open; Pfade mit / und dem Modul osstd/json: parseJson, %*, .to(Typ) konvertieren JSON und Objektestrutils.% ersetzt $1, $2 in einer Vorlage; fmt formatiert Zahlen wie printfimport std/[strutils, strformat, algorithm]
import std/unicode except strip, split, splitWhitespace, toUpper, toLower, capitalize, reversed, align, alignLeft, repeat
let s = "Hallo Nim-Welt"
echo s.len, " ", s.toUpperAscii, " ", s.toLowerAscii
echo s[0], " ", s[0..4], " ", s[^4..^1]
echo s.find("Nim"), " ", s.contains("Welt"), " ", s.startsWith("Hallo"), " ", s.endsWith("x")
echo s.replace("Welt", "Erde")
echo s.split(' ')
echo "a,b,,c".split(',')
echo @["x", "y", "z"].join("-")
echo " trim ".strip & "|"
echo "ab".repeat(3), " ", "7".align(4, '0'), " ", "x".alignLeft(3) & "|"
echo "42".parseInt + 1, " ", "3.5".parseFloat * 2, " ", "ff".parseHexInt
echo s.count('l'), " ", s.toUpperAscii.count('L')
echo "Nim".len, " ", "ä".len, " ", "äöü".runeLen
echo capitalizeAscii("wort"), " ", s.reversed
echo "x=" & $42 & " y=" & $3.5
echo "a b c".splitWhitespace
echo "CamelCase".normalize
echo "Zeile1\nZeile2".splitLines
echo "$1 und $2, $1 nochmal" % ["a", "b"]
echo isDigit('7'), " ", isAlphaAscii('x'), " ", isUpperAscii('A')
let name = "Mia"
let alter = 17
echo &"{name} ist {alter} Jahre alt, nächstes Jahr {alter + 1}"
echo fmt"{3.14159:.2f} | {42:5} | {42:<5}| {255:x} | {255:b} | {1234567:>10}"
echo fmt"{name:>6}|{name:<6}|{name:^6}|"try/except/finally und raise newException(...) behandeln FehlerOption[T] ersetzt fehlende Werte; some, none, gettemplate und macro erweitern die Sprache zur ÜbersetzungszeitcreateThread, Lock, Atomic; asynchron mit asyncdispatchimport std/strutils
type MeinFehler = object of CatchableError
proc pruefe(n: int): int =
if n < 0: raise newException(MeinFehler, "negativ: " & $n)
n
try:
echo pruefe(3)
echo pruefe(-1)
except MeinFehler as e:
echo "Eigener Fehler: ", e.msg
finally:
echo "aufgeräumt"
try:
echo parseInt("abc")
except ValueError as e:
echo "ValueError: ", e.msg
try:
let a = @[1, 2, 3]
echo a[10]
except IndexDefect as e:
echo "Indexfehler abgefangen"
try:
echo 10 div 0
except DivByZeroDefect:
echo "durch null"
proc sicher(a, b: int): int =
try: a div b
except DivByZeroDefect: -1
echo sicher(10, 2), " ", sicher(1, 0)CountTable und sequtils beschleunigen AuswertungenastToStr) lassen sich Testframeworks in wenigen Zeilen bauenproc sieb(n: int): seq[int] =
var prim = newSeq[bool](n + 1)
for i in 2..n: prim[i] = true
var i = 2
while i * i <= n:
if prim[i]:
var j = i * i
while j <= n:
prim[j] = false
j += i
inc i
for i in 2..n:
if prim[i]: result.add(i)
echo sieb(50)
echo sieb(10000).lennim c -r übersetzt und startet; nimble verwaltet Paketeimport std/[math, times, random, strutils]
randomize(42)
let r = rand(1..6)
echo r in 1..6
echo "Zeit: ", initDuration(minutes = 135).inHours
echo dateTime(2024, mMar, 15, 14, 30, zone = utc()).format("yyyy-MM-dd HH:mm")
echo (dateTime(2024, mMar, 15, zone = utc()) + 20.days).format("dd'.'MM'.'yyyy")
echo isLeapYear(2024), " ", getDaysInMonth(mFeb, 2024)
echo sum([1, 2, 3]), " ", sum([1.0, 2.0, 3.0]) / 3.0, " ", pow(2.0, 8.0)
echo "$1 von $2" % ["3", "5"]
echo $(1, "a"), " ", $[1, 2], " ", $true
echo repr(42)
echo sizeof(int), " ", sizeof(int32), " ", sizeof(char)
echo NimVersion.len > 0