As it's FAQ page explains, Nim is an imperative programming language, that tries to give the users ultimate power without compromises in runtime efficiency; and it delivers.
Nim is very expressive, letting you use classes, first order functions and operator overloading. It compiles to C and Javascript, but the latter won't support some functionality like file system access.
Results
Go version 0.14.2 was used for running the tests.
Compile time
How fast does the compiler takes to generate the binary.
$ time nim c --boundChecks:off --floatChecks:off --opt:speed -d:release nimrb.nim
real 0m0.623s
user 0m0.576s
sys 0m0.028s
Even though Nim compiles to C and then passes thru GCC, compilation time is very fast.
Running Time
$ time ./nimrb
real 1m53.320s
user 1m52.236s
sys 0m0.144s
Impressive!, running times are comparable to C, even a bit faster.
Just for the record, without any changes to the source code, the C implementation can beat this time when using the -Ofast compiler flag.
Code Metrics
Line count: 132 code, 45 blank, 177 total. File size: 5138 bytes.
Less than half the line count of C, and almost reaches the compactness of OCaml. File size-wise, this implementation is less than 300 bytes behind OCaml.
General Thoughts
I like this language, it offers some very flexible string interpolation options, and the compiler is very efficient. It even gives you hints on unused variables and functions.
It supports type inference, similar to OCaml, for tuples. You can create new tuples whenever you want, but if you try to pass it to a function or assign it to a typed variable, it will complain if members are missing (unlike Go).
One very cool feature is that you can write operator overloading; that helps a lot with expressiveness. The language also has many ways for calling functions, and supports polymorphism.
Code blocks are delimited by indentation, but unlike python, vim (using the nim.vim extension) behaved very well.
One thing I didn't like, was having to cast and/or specify the precision of every float number declaration, which is a bit verbose (float32() for casting and 'f32 for literals). I tried avoiding those declarations, defaulting to float64, but the code would run slower.
Anyway, Nim is a great language, and I am very impressed with the expressiveness and more than anything else, it's speed. Too bad it hasn't reached v1.0 yet, as some things are prone to change, or are still in a experimental state.
Follow
You can follow the development of this project on GitHub: https://github.com/niofis/raybench