14 ms·
Nim 2.0.0 RC2
- vrglvrglvrgl 4y ago[dead]
- HoppyHaus 4y agoAwesome! Really looking forward to the 2.0 release - specifically default object values, which is one of the few language-level pain points I've had.
- jphoward 4y agoI love Nim so much. I really hope some big company decides to use it as their workhorse language - it feels like the only thing holding it back is the lack of corporate 'buy in'. Most similarly good languages (except F# maybe?) seem to get lucky with becoming a poster boy for at least one company.
- esafak 4y agoI am in a position to do this and I picked kotlin instead as the tooling is not good enough yet. Without a good IDE experience you lose some of the productivity that nim potentially offers.
- crop_rotation 4y agoYup, corporate buy in is a big deal. Years ago I tried using Nim for a network daemon, but the sheer lack of even the most basic http libraries prevented me from doing it and I went with go. The library situation is a bit better now. But without a big company contributing in terms of libraries, the language usage will just be very low.
- FireInsight 4y agoNowadays atleast Nim has multiple compenent http libraries, see https://nimble.directory/search?query=http https://nimble.directory/search?query=http
- michaelsbradley 4y agoNot in that list, but nim-chronos also provides a solid http server/client: https://github.com/status-im/nim-chronos https://github.com/status-im/nim-chronos
- intelVISA 4y agoUnfortunately, it's too good of a language for serious corporate adoption...
- squarefoot 4y agoCompanies base their choice of tools on how easy is to find developers to hire, therefore Nim and other similarly young but very powerful/optimized languages (Crystal, Zig, ...) need many independent developers, who can base their choice purely on technical merits and personal taste, to use it and put it into their resumes before the corporate world can notice and add them into their list of accepted tools. It's a quite slow process though.
- carlmr 4y ago>Most similarly good languages (except F# maybe?) seem to get lucky with becoming a poster boy for at least one company. This one I still can't wrap my head around. F# basically was the source of almost all innovation in C# and C# still is missing some features and was not designed in the same way as F# so a lot of the features they "stole" feel tacked on. Microsoft should have just made F# the C# successor.
- solarkraft 4y agoI had a brief look at F#, it didn't fit my mental model and I looked away. Meanwhile I do like using the tacked-on functional features in traditional languages because it allows me to get the benefits when it fits what I'm doing instead of having to fully buy in.
- Herval_freire 4y agoYou're just using the tacked on features as syntactic sugar. You haven't "bought in" at all. I was traditionally trained like you under OOP and procedural methodologies. After encounter FP I fully bought in and developed two mental models. The fp model lives side by side with the the oop/imperative model. With equal knowledge in both one can make a more unbiased judgement. The fp model is actually superior imo. I largely have the opposite strategy now when programming. My mental model is largely fp, and I occasionally cheat and sprinkle in procedural or oop syntax here and there as syntactic sugar. The basic realization here should be that mutating shared state should be avoided and segregated as much as possible.
- ok_dad 4y ago> syntactic sugar To be fair, all languages are syntactic sugar over asm which is s-s over CPU machine code. A mental model is just that: a model for something physical that's in your head. FP or OOP are both mental models for programming in nearly any language. Some languages have first-class FP or OOP features, and some don't, but you can tack-on either of these, and others, to nearly any language you want to. It's really dumb to look down on others choice of mental model if it works for them. I have seen successful projects that were designed around both OOP and FP models.
- girvo 4y agoWhile we’re not a big company, my work uses it as our secret weapon for embedded firmware development.
- rthomas6 4y agoDo you do FPGA designs with it, or just bare metal software?
- girvo 4y agoSoftware on microcontrollers :)
- MrBuddyCasino 4y agoIf only it supported RV32IMAC and/or XTensa one could use it on one of the ESP32 variants.
- elcritch 4y agoNim supports both since it compiles with pretty much any C89 C compiler. Also https://github.com/elcritch/nesper https://github.com/elcritch/nesper :)
- MrBuddyCasino 4y agoOh nice! This looks very tempting…
- elcritch 4y agoFeel free to drop by Discord #embedded if you're tempted enough.. ;) I've had production devices running on it for years.
- girvo 4y agoWe use the ESP32-S3 as our main microcontroller!
- pron 4y agoProgramming language adoption -- like the adoption of many technological products -- is usually really fast. With the possible sole exception of Python, all programming languages, popular and unpopular alike, have reached the general ballpark (i.e. high/mid/low) of their all-time peak market share within 5-10 years. Dark horses are very, very rare.
- crop_rotation 4y agoIn general you are correct. However, language adoption can skyrocket when some new library/framework arrives which has a compelling reason to switch (e.g. Rails for Ruby)
- tokai 4y agoI can't see how there should be a reliable pattern in language usage like that. Javascript is more used that ever - who knows were the all-time market share peak is - but we're well beyond your 5-10 year time frame. Could you name any languages that actually have this pattern? Julia maybe.
- pron 4y agoAll languages, except possibly Python, have followed this patterns. Read my comment carefully: I said that virtually all languages reach their ballpark market share within 10 years. JS did reach its high market share ballpark within a decade.
- tokai 4y agoI understand what you are writing. But it only holds for you because your idea of ballpark is exceedingly wide. It's doesn't hold at all for the usage numbers I look at without your socalled ballpark being several magnitudes.
- pron 4y agoJS's market share did not grow by even one order of magnitude since ~2006 nor even close to an order of magnitude. There aren't that many orders of magnitude for a share to grow if you start counting at ~1%.
- ThomasTJdev 4y agoDitto! Nim is just easy and incredibly fast (to develop and the code!). Our code base is Nim based - even normal bash script have been replaced!
- alexbezhan 4y agoWhat app are you developing with it?
- ThomasTJdev 4y agoA full project management platform for construction projects. Webserver, websocket, microservices, etc.: https://cxplanner.com https://cxplanner.com
- treeform 4y agoIs Reddit big enough? https://www.reddit.com/r/RedditEng/comments/yvbt4h/why_i_enjoy_using_the_nim_programming_language_at/ https://www.reddit.com/r/RedditEng/comments/yvbt4h/why_i_enj...
- riku_iki 4y agohe said he works on some internal tool, but not clear how wide is adaptation outside of that.
- v3ss0n 4y agoThe main problem is people afraid about Style Insensitivity it enables by default .
- elcritch 4y agoIts set to produce a compiler "Warning" by default now.
- frigid 4y ago(for inconsistent usage) As background, style insensitivity was introduced so that codebases can use a consistent camelCase or snake_case regardless of the style used by upstream libraries.
- girvo 4y agoWhich as an aside, makes writing and using C bindings so lovely.
- j-james 4y agoWell, maybe not writing. Occasionally low-level C libraries - especially those that deal with keyboard input - decide to provide identifiers differing only in case... There's a WIP RFC for providing a way to deal with identifiers that need to be verbatium by surrounding them with backticks, though. https://github.com/nim-lang/RFCs/issues/477 https://github.com/nim-lang/RFCs/issues/477
- Aisen8010 4y agoIt's good to see that they chose the keyword discard instead of the underscore symbol. It's verbose, but at least you can see the damn thing.
- michaelsbradley 4y agoThe empty `discard` statement is a do nothing statement; it's not part of the type signature, if that's what you meant.
- speed_spread 4y agoIgnoring a return value is a normal thing in many situations. I like verbose but "discard" is weird enough that it might complexify API design to offer two functions instead of a single one.
- girvo 4y agoYou don’t need two functions, you just mark one as {.discardable.} and the discard happens automatically. Unless I’m misunderstanding you.
- michaelsbradley 4y ago`discard` isn’t part of the type signature. The functions in the blog post have void return type because between `)` and `=` there is no `: [type]`.
- 000ooo000 4y agoCan't get past the style insensitivity thing. Seems like a ridiculous 'feature' to build into a lang.
- kwhitefoot 4y agoI think the opposite. Case sensitivity beyond the first character just makes life difficult.
- geenat 4y agoIt's a big plus for library and FFI interop so external styles don't take over your entire project. Also, John Carmack: https://mobile.twitter.com/id_aa_carmack/status/1592560938208710659 https://mobile.twitter.com/id_aa_carmack/status/159256093820...
- IshKebab 4y agoPlenty of programming languages have "did you mean xxx?" in error messages. Plus using IDEs means you will mostly autocomplete identifiers anyway. I don't buy it.
- otherme123 4y agoThe point is to use third party libraries while keeping your prefered case in your code. You prefer your code in CamelCase, but some other guy made a library in snake_case. Still you can use the library using CamelCase, and not mixing. E.g. The Python Selenium library used to be in CamelCase, while almost all code in Python is snake_case. By using Selenium you ended up with code like: my_button = browser.getElementById("Button") They rewrote the whole library to be in snake_case, a change that forced a lot of code rewrite downstream. Even the Python builtin library has case inconsistencies (logging module is camelCase, sys has both alllowercase and snake_case) that weren't fixed even in 2to3. Nim would have handle this efortlessly, allowing you to use get_element_by_id or getElementById in the old library, and avoiding you the effort to rewrite your code if the Selenium mantainers decided for a case change. You can refactor your case without fear of making life worse for your users.
- synergy20 4y agoNim is still on the top of my to-study-to-use list, for c++ backend I'm unsure if it transpiles to c++20?
- overthrow 4y agoWhy would you want C++20? C++ is generally backwards compatible, so a modern C++ compiler will still compile C++11
- synergy20 4y agoc++20 provides quite a list of features on top of c++11 that I use daily these days, would like to know nim keeps up with those new syntax/features as well, seems not yet.
- FireInsight 4y agoIf those features exist in Nim, you can just use Nim. FFI should probably work on newer libraries too.
- netbioserror 4y agoNim uses C/C++/Obj-C as a sort of abstracted assembly. While it's possible to follow the generated code with some formatting and effort, it's made to be optimally machine-parsable and optimizable. I suggest giving Nim a try and checking out the generated sources to see for yourself.
- nu11ptr 4y agoI have no first hand knowledge, but my guess is their code generator would use the lowest compatible C++ version that has all the features they need - to maximize compatibility. If it was me I would actually be trying to avoid using the newer features of C++ as is shrinks your interoperability.
- berry_sortoro 4y ago[dead]
- synergy20 4y agois it true that I must use GC if I use stdlib of Nim, which by default most people will need its stdlib, how does that translate to c/c++/js when a GC is involved(c/c++ does not have GC)
- netbioserror 4y agoThe GC is a set of data structures and functions which are included in the compiled C/C++ source and which are called by the generated code.
- synergy20 4y agois this production ready? last time I checked GC for c and c++ and I don't think c and c++ are really GC-friendly by design. After nim's transpiling, is c/c++ using those data structures and functions somehow to manage resources(similar to RAII) but not really acting as a GC in c/c++?
- netbioserror 4y agoC and C++ both have very popular GC libraries which fulfill much the same purpose and even have the same design (the optional Boehm GC, for example). Those are likely good examples to look at to see how managed memory might be invoked by the Nim compiler. Alternatively, if you're using reference counting, that's simply C++'s preferred style (std::unique_ptr), as you already said. I can't speak to whether Nim's compiled code is using std::unique_ptr or something else.
- michaelsbradley 4y agoNim offers a choice of several GCs: https://nim-lang.org/1.6.0/gc.html https://nim-lang.org/1.6.0/gc.html for upcoming v2: https://nim-lang.org/docs/mm.html https://nim-lang.org/docs/mm.html Note that beginning with v1.6.2 it's specified with `--mm:[choice]` instead of `--gc:[choice]`, though the latter still works. And beginning with v2, the default GC will be orc, while to date it's refc. That's an important change and has involved a lot of hard work by maintainers and contributors leading up to the release of v2.0.0. See also the user guide for Nim's compiler: https://nim-lang.org/docs/nimc.html https://nim-lang.org/docs/nimc.html
- tiffanyh 4y agoWeb framework. If Nim had a super robust web framework, usage/adoption would skyrocket. It has all the ergonomic benefits of a language like Python but the perf/memory of C.
- afavour 4y agoI'm not so convinced. Web frameworks by and large don't need the perf/memory of C, they're always running on high powered servers. Nim feels like it would be perfect for embedded settings.
- barnabee 4y agoI’d love a really good Nim web server option, too. Something lightweight but with enough to quickly build APIs, like FastAPI in Python or maybe Chi in Go. Even if the speed wouldn’t do it for many people over, say, FastAPI, the static typing and less insane package and dependency management than Python, and lower friction/boilerplate than Go might.
- senko 4y ago> Web frameworks by and large don't need the perf/memory of C, they're always running on high powered servers But if they had perf/memory of C they wouldn't need to run on high powered servers! If a language allows you to be productive and can deliver high performance that can reduce your ops complexity and your hosting bill, what's not to like?
- kaba0 4y agoThat implies that we don’t already have high performance web frameworks in managed (thus more productive) languages already, which is not the case. C#, Java, Go are all such languages with plenty of examples.
- antifa 4y agoWith that logic, why should anyone use nim at all? Those are the terrible languages we've come to nim to be free of.
- 2h 4y agoI really wish they would fix the static linking. has needed a hack for three years: https://github.com/nim-lang/Nim/issues/15220 https://github.com/nim-lang/Nim/issues/15220
- xxpor 4y agoQuickly scanning this seems like a Windows-only problem, yes?
- deleted 4y ago[deleted]
- Decabytes 4y agoIt looks like it was fixed? https://github.com/dom96/choosenim/pull/227 https://github.com/dom96/choosenim/pull/227
- 2h 4y agoWhat does some random PR have to do with anything? That is not the Nim repo
- tryptophan 4y agoI like nim but I found the dev experience to be quite awful. Couldn't just install a plugin for VS code and hit run...had to configure stuff and not sure how to get the debugger to work still. I have strongly suspected for a while now that the language is kind of irrelevant, but the supporting infrastructure like package managers, IDEs, other utils, platform support, libraries, etc are far more important when picking a language to use. Who cares if java programs are 2x as long? Trying to fix your $obscure_language$ tooling will take 10x as long.
- nu11ptr 4y agoI noticed Nim allows using the Go GC as an option. How does this work? Does it compile into Go as a target language? Or can it link with Go's (ever changing) ABI? Or is the Go GC available as a standalone C lib? I'm just curious how this works...anybody know? EDIT: I think I found it - looks like it actually isn't new: https://forum.nim-lang.org/t/1278 https://forum.nim-lang.org/t/1278. Sounds like the answer is: Links via GCCGO to their channel implementation. Compatible GC was written in Nim to go with it.
- ok_dad 4y agoOK, so we have languages for nearly every niche now; Zig has it's allocator thing and goes with C very well, Go has goroutines and channels and CSP, Python has data science, Java has support/libraries for everything, etc. Let me suggest a new one: a language which is top-dog in it's language interoperability. Imagine a language that can do nearly nothing except glue together code from other languages. Maybe you want to call some Java code from some Go code from some Nim code from some Python code from your C program: this language would do that for you somehow.
- kaba0 4y agoThat’s just python, and I’m only half joking. Another idea for that would be GraalVM’s Truffle. It’s not a language, more of a universal VM, but it can actually already just eval some python code, use the resulting code from Java and pass it on to JS. It also has support for any LLVM language, so C can be invoked from/be invoked from any of the aforementioned languages. And it can even optimize across language boundaries, pretty incredible.
- elcritch 4y agoNim has an edge over Python as it can compile to C, ObjC, C++, JS. Meaning it can do native FFI in each of those. It can also compile to really fast and small WASM too. However it takes a long time to accrue enough good wrappers and bindings.
- SuaveSteve 4y ago
- pietroppeter 4y agoThis is very nice since it is progress towards 2.0 and a LOT of bugs were fixed. Kudos to the contributors! The element of novelty in this case are the error messages (which are very precise although not too easy to parse). In the meantime if you are curious how being on HN homepage affects traffic, analytics of nim website are public: https://plausible.io/nim-lang.org?period=30d https://plausible.io/nim-lang.org?period=30d
- titzer 4y agoEven as a "competitor"[1], it's great to see systems languages getting better. I am glad there are alternatives and competition with C/C++, Rust, Zig, etc. Congrats! [1] Well, not really a competitor, Virgil is never going to hit it big, heh. I'm mostly scratching my own itch and doing research.
- monetus 4y agoThe zig author(s) have been in the nim forums a bunch, I like seeing the ideas and techniques bounce around. Your language can output Jars and web assembly modules. How is the FFI? Think it would make sense to use along with nim in the same codebase? Edit: thanks for all your works btw, it means a lot.
- titzer 4y agoThe Wasm target allows you to specify imports (basically "import component Foo { methods... }") and exports, so the resulting .wasm module has those declared imports/exports. There really isn't an FFI for other targets yet, but I get a lot of requests for that, so I am thinking of how to do this now. Probably, the native targets will support import/export and generate a .o that can be linked with C/C++ Rust using the normal linker.
- cb321 4y agoEcosystem-wise - a brief subset of Nim packages: https://github.com/ringabout/awesome-nim packages.json has many more - over 2000.
- FireInsight 4y agohttps://nimble.directory/ https://nimble.directory/ for a package directory for the package manager `nimble`
- monetus 4y agoFor a year or two now, nim has been what I've enjoyed programming in the most. Thanks to everyone involved. The new improvements are much welcome.
- paletteOvO 4y agoIt is a good language. But most good language is just never popular.
- Patrickmi 4y agoWe can say “general purpose languages” never gets to be popular There must be a reason of wanting to adopt the language not just because “I like it”
- paletteOvO 4y agoI'm pretty sure there are a lot of projects using some language just because the developer likes it. Even in a company, personal preference could still affect a lot in choosing the language though they might concern more than that. And after that, the language might become popular because some big companies use it/develop it, or someone makes a killer library. Most reasons are just not relevant to the language itself.
- tiffanyh 4y agoHas anyone reconciled the list of recommended Nim 2.0 changes from last years discussion, to this RC? https://forum.nim-lang.org/t/9132 https://forum.nim-lang.org/t/9132 https://gist.github.com/j-james/08cd36b7475d461d6291416381ce98ad https://gist.github.com/j-james/08cd36b7475d461d6291416381ce...
- deleted 4y ago[deleted]
- curioussavage 4y agoNim rocks and the ecosystem has made some great strides lately. I highly recommend checking it out One awesome project is https://github.com/jmgomez/NimForUE https://github.com/jmgomez/NimForUE
- _dain_ 4y agoMight give Nim another look. I stopped using it a while ago after getting frustrated with its iterators. Does the v2 improve them? I didn't see anything major about them in the release notes.
- summarity 4y agoWhat's wrong with Nim's iterators?
- _dain_ 4y agoI wrote a comment about it a while go: https://news.ycombinator.com/item?id=34669902 https://news.ycombinator.com/item?id=34669902 basically Nim has several features which on their own seem great, but don't compose with each other properly. also it's been many months since I used Nim so some of the details may be outdated or misremembered but the overall gist of what i'm saying is >90% true so i don't care if anyone nitpicks this: Nim has UFCS (uniform function call syntax). so whenever you have f(a, b), you can write a.f(b), and it means literally the same thing (until you read the fine print for the parts where it's not). and you can also omit parentheses when it's unambiguous, so you can write stuff resembling method-chaining or unix pipelines in a totally natural way: foo.bar.baz(x, y).qaaz().quux is the same as quux(qaaz(baz(bar(foo()), x, y))) and way more readable bc less parens and the execution order is left-to-right. it's so, SO, tempting to write lots of code this way, because it's such a rare language feature, and it fits with the way I think. but it's not just functions, there are a lot of function-like things, i.e. the stuff you can write as f(a, b): methods, ad-hoc overloaded functions, generic functions, templates, macros, iterators, etc. but things don't work consistently across all combinations of function-like objects, argument types, and function-call syntaxes. iterators is one part where the abstraction breaks, and iirc there are a few others (certain kinds of templates?). there are two kinds of iterators: inline, and closure. inline iterators are meant to be a zero-cost abstraction, basically a for loop that gets inlined at the call site by the compiler, and they're not first-class objects. closure iterators otoh are first-class objects and can be passed around, but they have runtime overhead (idk how much). so lets say you want to make an API that consumes an iterator and does something useful with it, e.g. higher-order functions like python's itertools (Nim advertises itself as being similar to python in important respects like this so it's a valid comparison). great, so then you try to use it on the builtin "lines" iterator (the one that splits a file at newlines and yields each line as a string). oh no, you can't, because "lines" is an inline iterator so you can't pass it to a function. fine, so the language has handed me this pile of dogshit that I can't do anything useful with directly. surely this would be a common enough problem that there must be a helper macro in the stdlib that lets you convert between inline and closure iterators? nope, there isn't. okay but writing one should be trivial, right, given the vaunted metaprogramming capabilities of Nim? well, I tried writing one in the most obvious way. and it behaved differently when I used UFCS vs not. and when I experimentally called it on a closure iterator (expecting it to be effectively a no-op), the compiler segfaulted. and when I asked about this in the discord, nobody could figure out why it didn't work. later I found an implementation of inline<->closure conversion macro and it was like hundreds of lines of gensym fuckery and god knows what. i don't know why it should be so complicated. oh and btw, even with the supposedly "first-class" closure iterators, it is impossible to write a generic function like f: iterable[T] -> iterator[T]. you have to use a template. and the syntax for doing it is counterintuitive. and the "iterable" keyword in the function signature doesn't mean what you think anyway. when you ask in the chat "oh my god just please tell me how to do lazy iteration", they say "don't worry it's easy, just use [x]", where x is one of half a dozen mutually incompatible 3rd party libraries, each one expecting you to learn its own mad little DSL that you can't really extend or integrate with normal Nim code. and then you look at the implementation: enormous inscrutable macros, which are that way presumably to work around all the crap I described in the last paragraphs and even more I don't know about. I don't want that in my dependencies! the docs don't prepare you for all this complexity; templates/macros/iterators are documented like that "draw the rest of the fucking owl" meme. the "sugar" module has a macro to let you write lambdas more compactly. but if you try to do something straightforward like pass one into sort() as a comparison function (ie the kind of stuff that comprises 95% of the legit uses of anonymous functions in grugbrain code), it doesn't fucking work reliably. like it will probably work on a simple case like sorting a bunch of strings by their length, but the minute you introduce some complication like generics it all falls apart and the compiler spams ten pages of indecipherable type errors at you. and then they'll say "just use sortIt" -- no, fuck you, i will never use sortIt, i hate anaphoric macros, just let me pass in an honest function. what I'm getting at is, you know how frictionless it is to sling around iterators and generators and first-class functions and so on in Python, even with mypy --strict? and you read about Nim's UFCS and macros and generics and you think "great, best of both worlds", imagining yourself as a ninja doing "myfile.txt".lines.map(func1).filter(func2).max(key=blah).frobnicate, and it all Just Works[tm]? well the reality is as frictionless as dragging your face across raw asphalt.
- pietroppeter 4y agoAs a reminder, at Nim Conf back in October 2022 Andreas presented Nim 2.0 in this video https://www.youtube.com/watch?v=aDi50K_Id_k&list=PLxLdEZg8DRwSQQaK0UVRd1DaetVc3lIwr&index=2 https://www.youtube.com/watch?v=aDi50K_Id_k&list=PLxLdEZg8DR... Hearing again I cannot chuckle when Araq says: Nim v1 is good at everything, Nim v2 is supposed to be better at everything. Back then it was supposed to come out in 2022 and indeed a RC1 came out in Dec. In the blogpost for RC1 you find the desciption of all new features: https://nim-lang.org/blog/2022/12/21/version-20-rc.html https://nim-lang.org/blog/2022/12/21/version-20-rc.html This longer time is because extra care is being taken into having a smooth transitions (for example important libraries have been tested to work on nim v2, e.g. we made sure nimib was working with v2 in early Feb: https://github.com/pietroppeter/nimib/releases/tag/v0.3.6 https://github.com/pietroppeter/nimib/releases/tag/v0.3.6)
- treeform 4y agoThe smooth transition can't be overstated. Its such a breath of fresh air, when many platforms, libraries just drop support all the time.
- inv2004 4y agoSome background: I spent years in C++, then many years in Java, Ocaml, Python, Rust and even APL - everything is for production. My last pet-project was on Rust also, and it took about 2+ years and I felt pretty depressed about IT at all. One of the part of the project (feed collector) I tried to write in many languages to compare. One day I downloaded Nim - did not expect anything at all - just wanted to try async and ... in about 2 hours (on new language for me) I had the same functionality I spent 2 weeks in Rust. More interesting - it was about 30% faster than Rust solution. After it, I can just show the picture: https://user-images.githubusercontent.com/4949069/229308266-2b20c00c-ab2c-435e-983c-1174d805da44.jpg https://user-images.githubusercontent.com/4949069/229308266-... I rewrote full (2 years+) project in Nim in 3 weeks. I understand that I knew good architecture for the second implementation, but 3 weeks is good anyway. Did a lot of pet-projects, I use it for small prod tools or research if it is possible. For example I wanted to extend atop functionality, and I wrote my own ttop: https://github.com/inv2004/ttop https://github.com/inv2004/ttop For new Nim's user I would describe it like python with speed of C-lang. But later you will find that it is not another python, it is its own language with a lot of powerful things like templates, macros, very good interop with C (that is why libraries are not a problem most of the time) and etc.
- inv2004 4y agoAlso, I would like to mentioned that I was impresses how much the Nim is perfect shape with quite small team of core contributors compared to many other languages. There are some bugs, of course. nimsuggest (main thing for LSP) is not in the perfect shape. But I did not have any feelings of unfinished product like Pony-lang, Crystal and etc