支持各种后端:可以被编译为 C、C++ 或 JavaScript,
以便 Nim 可用于所有后端和前端需求。
表现力
Nim 实现了自举:编译器和标准库都是用 Nim 本身来实现的。
Nim 拥有强大的宏系统,允许直接操纵 AST,提供无限的可能性。
优雅
宏不会改变 Nim 的语法,因为并没有这个必要
—— Nim 语法本身已经足够灵活。
具有局部类型推断、元组、泛型和sum类型的现代类型系统。
语句按缩进分组,也可以跨行。
importstd/strformattypePerson=objectname:stringage:Natural# Ensures the age is positiveletpeople=[Person(name:"John",age:45),Person(name:"Kate",age:30)]forpersoninpeople:# Type-safe string interpolation,# evaluated at compile time.echo(fmt"{person.name} is {person.age} years old")# Thanks to Nim's 'iterator' and 'yield' constructs,# iterators are as easy to write as ordinary# functions. They are compiled to inline loops.iteratoroddNumbers[Idx,T](a:array[Idx,T]):T=forxina:ifxmod2==1:yieldxforoddinoddNumbers([3,6,9,12,15,18]):echoodd# Use Nim's macro system to transform a dense# data-centric description of x86 instructions# into lookup tables that are used by# assemblers and JITs.importmacros,strutilsmacrotoLookupTable(data:static[string]):untyped=result=newTree(nnkBracket)forwindata.split(';'):result.addnewLit(w)constdata="mov;btc;cli;xor"opcodes=toLookupTable(data)foroinopcodes:echoo
varconditional=42ifconditional<0:echo"conditional < 0"elifconditional>0:echo"conditional > 0"else:echo"conditional == 0"varternary=ifconditional==42:trueelse:falsevaranother=ifconditional==0:"zero"elifconditionalmod2==0:"even"else:"odd"# Case switch.varletter='c'caseletterof'a':echo"letter is 'a'"of'b','c':echo"letter is 'b' or 'c'"of'd'..'h':echo"letter is between 'd' and 'h'"else:echo"letter is another character"
importstd/math# Basic math.assert1+2==3# Sumassert4-1==3# Subtractionassert2*2==4# Multiplicationassert4/2==2.0# Divisionassert4div2==2# Integer Divisionassert2^3==8# Powerassert4mod2==0# Moduloassert(2xor4)==6# XORassert(4shr2)==1# Shift RightassertPI*2==TAU# PI and TAUassertsqrt(4.0)==2.0# Square Rootassertround(3.5)==4.0# RoundassertisPowerOfTwo(16)# Powers of Twoassertfloor(2.9)==2.0# Floorassertceil(2.9)==3.0# Ceilassertcos(TAU)==1.0# Cosineassertgcd(12,8)==4# Greatest common divisorasserttrunc(1.75)==1.0# TruncateassertfloorMod(8,3)==2# Floor ModuloassertfloorDiv(8,3)==2# Floor Divisionasserthypot(4.0,3.0)==5.0# Hypotenuseassertgamma(4.0)==6.0# Gamma functionassertradToDeg(TAU)==360.0# Radians to Degreesassertclamp(1.4,0.0..1.0)==1.0# ClampassertalmostEqual(PI,3.14159265358979)asserteuclDiv(-13,-3)==5# Euclidean DivisionasserteuclMod(-13,3)==2# Euclidean Modulo
importstd/[strutils,strscans]assert"con"&"cat"=="concat"assert" a ".strip=="a"assert"42".parseInt==42assert"3.14".parseFloat==3.14assert"0x666".parseHexInt==1638assert"TrUe".parseBool==trueassert"0o777".parseOctInt==511assert"a".repeat(9)=="aaaaaaaaa"assert"abc".startsWith("ab")assert"abc".endsWith("bc")assert["a","b","c"].join=="abc"assert"abcd".find("c")==2assert"a x a y a z".count("a")==3assert"A__B__C".normalize=="abc"assert"a,b".split(",")==@["a","b"]assert"a".center(5)==" a "assert"a".indent(4)==" a"assert" a".unindent(4)=="a"forwordintokenize("This is an example"):echowordlet(ok,year,month,day)=scanTuple("1000-01-01","$i-$i-$i")ifok:assertyear==1000assertmonth==1assertday==1