1. 0

    You have a binary that is fast (2 ms), small (107 kB) and dependency-free.

    Ya, that’s true because nim compiles to c! Then it compiles to a binary by using gcc or clang (for example).

    So it’s not actually dependency free… you’ll need a unix environment at least to provide stdout/in IO.

    Nevertheless it’s interesting – although I haven’t had the impression that it’s quite that unknown… I believe I heard about it the first time somewhere around 2014. Although I’ve never used it myself, I’ve always seen articles about it from time to time.

    1. 6
      $ nim c hello.nim 
      Hint: used config file '/nix/store/ab449wa2wyaw1y6bifsfwqfyb429rw1x-nim-0.18.0/config/nim.cfg' [Conf]
      Hint: system [Processing]
      Hint: hello [Processing]
      CC: hello
      CC: stdlib_system
      Hint:  [Link]
      Hint: operation successful (11717 lines compiled; 2.748 sec total; 22.695MiB peakmem; Debug Build) [SuccessX]
      $ ./hello 
      Hello, world!
      $ ldd hello
      	linux-vdso.so.1 (0x00007ffe06dd1000)
      	libdl.so.2 => /nix/store/fg4yq8i8wd08xg3fy58l6q73cjy8hjr2-glibc-2.27/lib/libdl.so.2 (0x00007f4a0c356000)
      	libc.so.6 => /nix/store/fg4yq8i8wd08xg3fy58l6q73cjy8hjr2-glibc-2.27/lib/libc.so.6 (0x00007f4a0bfa2000)
      	/nix/store/fg4yq8i8wd08xg3fy58l6q73cjy8hjr2-glibc-2.27/lib/ld-linux-x86-64.so.2 => /nix/store/fg4yq8i8wd08xg3fy58l6q73cjy8hjr2-glibc-2.27/lib64/ld-linux-x86-64.so.2 (0x00007f4a0c55a000)
      $ ls -hal hello
      -rwxr-xr-x 1 andy users 185K Sep 22 15:53 hello
      

      This depends on libc and a runtime dynamic linker. If you built this on your machine and sent me this binary I wouldn’t be able to run it because NixOS has a non hard-coded dynamic linker path.

      Can’t help but do a comparison here…

      $ time zig build-exe hello.zig 
      real	0m0.309s
      user	0m0.276s
      sys	0m0.035s
      $ ./hello 
      Hello, world!
      $ ldd hello
      	not a dynamic executable
      
      $ ls -ahl hello
      -rwxr-xr-x 1 andy users 390K Sep 22 16:01 hello
      
      1. 2

        I’ll be honest and say that I don’t know how to achieve this using C off the top of my head, but I’m willing to be that it is possible. If it’s possible in C, it’s also possible in Nim.

        Please keep in mind that Nim links with libc dynamically by default, there is nothing stopping you from statically linking libc into your executables if you so wish.

        1. 1

          But will they still be as small?

          1. 2

            Of course not. But then I also don’t really care about binary sizes, as long as they’re not ridiculously large.

      2. 1

        I think that’s a pretty silly definition of dependency free

        1. 4

          I guess it depends on your perspective, but it does seem like an extremely pedantic definition. In that case, every Unix C program is dependent on a libc and Unix kernel… but generally we don’t talk about dependencies like that.

          I will say this tho: I wish languages like nim & zig focused more on tree shaking to get down to the size of C, or as close as possible. Would help in other environments, such as the embedded space, and would be generally better for all.

          1. 2

            I wish languages like nim & zig focused more on tree shaking to get down to the size of C, or as close as possible. Would help in other environments, such as the embedded space, and would be generally better for all.

            Do you have an example of how Zig doesn’t do this?

            1. 1

              (edit also I apologize for the late reply, I’m on client site this week)

              it’s been a while since I last built Zig (I use a local Homebrew, so I ended up having to manually link LLVM and Clang, which wasn’t bad once I figured out how to do so), but even the example displayed above was 390K, so potentially large parts of the Zig RTS is included therein. I think Zig is probably the best of the bunch (I’ve recommended several clients to look into it as part of their roadmap for future embedded projects!), but I do think some room for improvement wrt what’s included could be made.

              As an aside, I thought I’d try and see if Zig was included in Homebrew now, but the build is dying:

              [ 65%] Built target embedded_softfloat
              make[1]: *** [CMakeFiles/embedded_lld_elf.dir/all] Error 2
              make: *** [all] Error 2
              
              1. 2

                There are a few things to know about the size of the above example. One is that it’s a debug build, which means it has some extra safety stuff in there. It even has a full debug symbol parsing implementation so that you get stack traces when your program crashes. On the other hand, if you use --release-small then you get a 96KB executable. (Side note - this could be further improved and I have some open bug reports in LLVM to pursue this.) The other thing to note is that the executable is static. That means it is fully self-contained. The nim version (and the equivalent C version) dynamically link against the C runtime, which is over 1MB.

                So the Zig runtime is smaller than the C runtime.

                I recommend to wait 1 week until zig 0.3.0 is out before trying to get it from homebrew. The Zig PR to homebrew had llvm@6 in it, to prevent this exact problem. They rejected that and said we had to drop the @ suffix. So naturally it broke when llvm 7 came out.

                1. 1

                  Oh I realized that Zig was statically linked, but I did not realize that it had no further dependency on libc; that’s pretty interesting. Zig has been on my radar since I first caught wind of it some time ago (I enjoy languages & compilers, it’s part of my job & my hobby), but it’s interesting to see no further links!

                  Previously I fought with getting Zig built out of git directly; the fighting was mostly surrounding linking to LLVM deps in Homebrew, because the two didn’t seem to like one another. Once it was working tho, it was pretty sweet, and I used it for some internal demos for clients. I’ll certainly wait for 0.3.0, it’ll be neat to see, esp. given the new info above!

                  1. 2

                    As of this morning 0.3.0 is out! And on the download page there are binaries available for Windows, MacOS, and Linux.

                    1. 2

                      Trying it now, and thank you so much! It runs right out of the box (which is so much easier than fighting with a local homebrew install) on Mojave!

          2. 1

            My point is that it couldn’t be executed in a Windows or Plan 9 environment. When people like saying the only IDE they need is Unix, it’s worth pointing out that that means they don’t only need a specific program, but a whole OS – and that’s a dependency in my eyes.

            1. 1

              WSL exists and Plan 9 is an irrelevant research operating system. Something that depends on POSIX is depending on the portable operating system standard. It’s the standard for portable operating systems. It’s a standard that portable software can rely on existing on every operating system. If your operating system doesn’t support POSIX then you have no right to complain that software isn’t ported to it, IMO.

              You don’t need a particular OS, you need any OS out there that implements POSIX, which is all of them in common use.

              1. 1

                I don’t care about rights, and that’s not what I meant. I understand your point, but I wanted to say was that the way the author phrased it made me hope (naively, maybe) that there was some actual technology behind Nim that makes it OS independent (since, as I’ve already said, I think a OS is a dependency, regardless of which standards may or may not exist).

        1. 3

          It’s a real shame that Nim is dismissed because of its bus factor + low popularity. Please help us get out of this catch-22 scenario. The fun and performance that the language offers really outweighs this.

          One problem is that if the creator lost interest the project would grind to a total halt, which may be a reason for the lack of adoption.

          While this is true the likelihood of it happening is low. The project has been going for a while now and the creator has not budged at all when it came to his passion for it.

          I’ve got a question for you as well: how did you evaluate the popularity of the languages? I’ve noticed that Nim has a score of 1 here, but Zig has a score of 2. I find that strange.

          1. 3

            I’ve noticed that Nim has a score of 1 here, but Zig has a score of 2. I find that strange.

            That seems like an oversight on my part - you are right, I will update the page with a note.

            I actually had the most fun writing Nim of any language recently - For other projects I would definitely use it.

          1. 4

            Timely. I have Nim in Action here after skimming the tutorial (as much to support the book author as anything), and my reactions to most of the language have been “Oh, that’s convenient”. I’m drawn to the easy C/C++ FFI but overall my fiddling with the language has been pleasant.

            1. 2

              Nim in Action looks interesting. I like it that it directly dives into building things (at least it looks like that from Chapters 3 through 7). Most other books lose me at “here are 10 ways how to declare an integer”.

              1. 3

                This is precisely what I was going for when writing Nim in Action. Super glad to see it being appreciated :)

                I strongly believe that learning by implementing (sometimes large) practical examples is the best way to learn a programming language. Learning every single detail of the language presented through small unrealistic examples gets boring quickly.

              2. 1

                How up-to-date is the book? It was published 2 years ago, I think, but I imagine a lot has changed in that time?

                1. 2

                  Reasonably up to date for a dead-tree edition, it’s from 2017. I haven’t compared to the complementary ebook but those are “live” and get updates. I’ve noticed a couple changes/errata (compiler invocation option, deprecation of Aporia editor, a change to the ..< operator) but nothing significant.

                  1. 8

                    Indeed, it’s barely a year old.

                    I’ve actually added all the projects in the book to the Nim compiler’s test suite so the book should remain compatible with new versions. I’ve also asked our BDFL to not break these, so far so good :)

                    1. 3

                      Great idea on that!

                      1. 1

                        Cool. I love when the author jumps in on a comment :)

                1. 6

                  I really, really want to like Nim but there are just too many oddities for me to seriously dig in. The biggest one is probably the story for writing tests: given its import and visibility rules, it’s really awkward to test functions that aren’t explicitly exported. The official position is, “don’t test those functions,” which I find somewhat naive.

                  The standard library is a bit unwieldy, but maybe it’s just a maturity issue. For instance, the “futures”-like system for threads, processes and coroutine style processing are all incompatible. What?

                  Finally, (and maybe this is just taste), but there’s heavy use of macros everywhere. The nim web server (jester), for instance, is heavily macro-ized which means error messages are odd and pretty severely affects composability.

                  1. 4

                    Don’t forget the partial case sensitivity. “Let’s solve camelCase vs snake_case by allowing you to write any identifier in either, at any time! Yay!”

                    1. 2

                      it’s really awkward to test functions that aren’t explicitly exported. The official position is, “don’t test those functions,” which I find somewhat naive.

                      I don’t know if that’s the official position, but you can test internal functions in the module itself in the when isMainModule: block. Here’s an example.

                      1. 3

                        You can also include the module and test it that way. So there are definitely ways to do it. I don’t think there are any official positions on this.

                        1. 1

                          Hmm, I seem to remember include getting kind of messy on larger code bases – wish I could be more specific, it was a while ago. By official position I meant the responses by the developers on the Nim forum, so maybe that was a bit heavy handed.

                    1. 8

                      Why are we upvoting a press release?

                      1. 2

                        Apologies if lobste.rs isn’t the right place for this announcement. But I can’t help but wonder why that might be. Can you or one of the upvoter’s explain?

                        1. 2

                          Look at the rest of the discussion in this thread. It’s about nim the technology. There are heaps of other places to post and read press releases. lobste.rs is a place to discuss technology.

                          There are no hard and fast rules about what links are appropriate here. I suggest taking a look at this meta thread on the topic of Lobsters Community Standards.

                      1. 3

                        Everytime I see a post for Nim I am hoping for a Golang competitor that can actually bring something new to the table. But then I look at the library support and community and walk back disappointed. I am still hoping for nim to take off and attract Python enthusiasts like me to a really fast compiled language.

                        1. 12

                          But then I look at the library support and community and walk back disappointed.

                          It’s very hard to get the same momentum that Go achieved, just by the sheer fact that it is supported and marketed by Google. All I can say is: please consider helping Nim grow its community and library support, if everyone sees a language like Nim and gives up because the community is small then all new mainstream languages will be owned by large corporations like Google and Apple. Do you really want to live in a world like that? :)

                          1. 3
                            1. 1

                              Have tried it; GC is way to optimistic so under high loads you would see memory being wasted. I love the syntax and power of language but it still stands shy when you can’t compile single binary (like golang) and end up with weird cross compile issues. Nim is way more efficient in terms of memory and GC overhead.

                              1. 1

                                Cannot compile single binary? What do you mean by that?

                                1. 1

                                  Let me rephrase; binary is not standalone with everything static linked (LibSSL and some dependencies). I had to recompile my binaries on server to satisfy the dynamic linked libraries with particular version.

                                  1. 5

                                    I think that’s more a result of Go having the manpower to develop and maintain an SSL library written in Go. As far as I understand, if you were to write an SSL library in 100% Crystal you wouldn’t have this problem.

                                    By the way, Nim goes a step further. Because it compiles to C you can actually statically embed C libraries in your binary. Neither Go nor Crystal can do this as far as I know and it’s an awesome feature.

                                    1. 3

                                      Is there a distinction between “statically embed C libraries in your binary” and “statically link with C libraries”? Go absolutely can statically link with C libraries. IIRC, Go will still want to link with libc on Linux if you’re using cgo, but it’s possible to coerce Go into producing a full static executable—while statically linking with C code—using something like go install -ldflags "-linkmode external -extldflags -static".

                                      1. 2

                                        There is a difference. Statically linking with C libraries requires a specially built version of that library: usually in the form of a .a or .lib file.

                                        In my experience, there are many libraries out there which are incredibly difficult to statically link with, this is especially the case on Windows. In most cases it’s difficult to find a version of the library that is statically linkable.

                                        What I mean by “statically embed C libraries in your binary” is: you simply compile your program’s C sources together with the C sources of all the libraries you depend on.

                                        As far as Go is concerned, I was under the impression that when you’re creating a wrapper for a C library in Go, you are effectively dynamically linking with that library. It seems to me that what you propose as a workaround for this is pretty much how you would statically compile a C program, i.e. just a case of specifying the right flags and making sure all the static libs are installed and configured properly.

                                    2. 2

                                      I suppose you built with --static?

                                      1. 2

                                        You have to jump through quite a few hoops to get dynamic linking in go.

                                        By default it statically links everything, doesn’t have a libc, etc.

                                      2. 1

                                        It’s not uncommon or difficult in go to compile a webapp binary that bakes all assets (templates, images, etc) into the binary along with a webserver, HTTPS implementation (including provisioning its own certs via ACME / letsencrypt), etc.

                                        1. 1

                                          only have a passing familiarity with go’s tooling, how do you bake in assets?

                                          1. 1

                                            There are different approaches, https://github.com/GeertJohan/go.rice for example supports 3 of them (see “tool usage”)

                                      3. 1

                                        I think he mentions the ability to statically build [1] binaries in Golang. I’d note that this is a feature that is not so common and hard to achieve. You can do this with C/C++ (maybe Rust), but it has some limits, and it’s hard to achieve with big libraries. Not having statically built binaries often means that you need a strong sense of what you need and to what point or using good packaging/distribution workflows (fpm/docker/…).

                                        It’s a super nice feature when distributing software (for example tooling) to the public, so it feels like “here you are your binary, you just have to use it”.

                                        [1] https://en.wikipedia.org/wiki/Static_build

                                  2. 1

                                    The “programming by duct taping 30 pip packages together” method of development is pretty new, and it isn’t the only way to program. Instead, you grow the dependencies you need as you build your app, and contribute them back once they’re mature enough.

                                    More time consuming, but you have total control.

                                  1. 3

                                    The survey is aimed at everyone, whether you’ve never heard of Nim before, used it previously but stopped or are using it day-to-day, we want your feedback :)

                                    1. 1

                                      I’m excited about Nim. I spent some time last week playing around and really liked what I see.

                                      But somehow I found the import mechanism a bit confusing. I didn’t quite understand that importing a module makes all its members available in the current scope, but they’re also dot-accessible using the module name. And also, since func(a) and a.func() are equivalent (correct me if I’m wrong), there are like 3 ways to call a function defined in another module.

                                      For instance, in the strutils example, if I start reading this code with no other context, I would assume that split() is defined for string types. But it’s actually a part of strutils module. And s.split(), strutils.split(s), and split(s) are all doing the same thing.

                                      I guess you start picking these things up the more you work with a language. But I have a Python background, so code being very explicit is something I’m used to and have really come to appreciate.

                                      1. 1

                                        Yeah, I hear you. Nim is a little different in this regard, but we do get a lot of the same sentiment. If you’re interested do give us your thoughts in this RFC on GitHub: https://github.com/nim-lang/Nim/issues/8013

                                        1. 1

                                          Done!

                                      1. 1

                                        This is very cool! Congrats on shipping.

                                        Using control-click to open in a new tab is broken for some reason, fixing that would be great!

                                        1. 1

                                          Thank you, and thank you for taking a look :)

                                          Odd that the control-click issue is still present. I thought I fixed it for both Ctrl and Cmd (for Macs), unfortunately I only have a Mac with me so I can’t verify the Ctrl issue. I’m checking for ctrlKey, I wonder if it isn’t true for some reason.

                                          1. 1

                                            I’m on Firefox on Windows, hm. Maybe I’ll see if I can fix the bug.

                                            1. 1

                                              So, I went to look at this today and it works perfectly now. I don’t know if anything changed, but it seems to work just fine.

                                              1. 1

                                                Wow, you have a good memory :)

                                                We did fix some IE bugs, likely was the same issue.

                                          1. 3

                                            I love the minimal dependencies and easy database. Should make it much easier for hobbyist operators.

                                            The advantage of Discourse is the business model. They will be in business and supporting their system 5 years from now. The odds are that this project will not.

                                            1. 2

                                              Thank you! Glad you love it :)

                                              Indeed, that is Discourse’s advantage. All I can say is that this project has already been around for more than 5 years, albeit in a much different form, so it is likely to stick around for another 5. Perhaps I should look into copying their business model, I do find it sorta insane that they are charging $100/month minimum for hosted instances of Discourse, but I suppose that is how they make money to support their project.

                                              1. 4

                                                You are thinking like a developer, not a pricing expert. There are plenty of cases where $100/mo is quite cheap. As a business, you want to get customers with lots of budget and little actual traffic demand. Customers are thinking of it as a service they don’t need to staff and manage through IT. Think in terms of value you provide, not your costs to provide that value, when pricing.

                                                Feel free to join my happy hour some week if you want to talk about building a business on your open source:

                                                https://sidekiq.org/support.html

                                                1. 1

                                                  Just saw your reply. Makes a lot of sense! I’ll definitely check out your happy hour, thanks :)

                                            1. 5

                                              i didn’t see anything with noscript turned on, which unfortunately disqualifies the project from use.

                                              some lightweight discourse alternatives which don’t require javascript are fluxbb, and mailing lists.

                                              to not leave anything out, i should also say that nim-forum is using a fairly loose definition of “lightweight.” maybe compared to discourse it is. but fluxbb 1.2.24 is written in under 9000 lines of PHP, with the only other dependency being some database. nim has a longer list of dependencies, and the dependencies themselves are quite heavy.

                                              1. 2

                                                I’m genuinely curious why this disqualifies the project. Is it just a point of principle? Is it that you do not deem it safe to execute JS on websites?

                                                I don’t consider fluxbb and mailing lists to be alternatives to be honest. The former is a classic forum and the latter is, well, a mailing list.

                                                I just checked and the current codebase is 5300 lines of code. Which dependencies are heavy?

                                                1. 4

                                                  One example of why SPAs cannot be used: if anything goes wrong, the whole site just breaks. On my phone (Blackberry Q10) https://forum.nim-lang.org/ just loads a blank white page and nothing more.

                                                  1. 1

                                                    That’s a good point. In the future it might be possible to pre-render the HTML on the server-side (it should be especially easy as the frontend is written in Nim too) and gracefully downgrade the experience (full page reloads on all links). I think for right now though, the current forum handles 90% of the use cases well, do remember that this is the initial version.

                                                    Btw I would appreciate any more information about the Q10 failure, is JS simply disabled there? or is it not handling the forum’s JS properly? If you could open an issue on GitHub that would be brilliant.

                                                    1. 2

                                                      I assume it’s not handling the forum’s JS properly. If I get some time I’ll try to figure out how to hook up the web inspector, see what the error is, and open an issue :)

                                                      1. 1

                                                        Thank you!

                                                  2. 3

                                                    ah, i was being an idiot w/r/t to the listed dependencies. none of those are all that heavy. sorry about that!

                                                    but there is one huge unlisted dependency: one of three major web engines. this is part of why i don’t support projects that don’t work without javascript. plenty of web forums are usable in dillo, netsurf, mothra, and lynx. people should not have to depend on the insane treadmill of ever-expanding web complexity for simple text-based communication.

                                                    the other part is that javascript can be used to track you. people cannot be expected to review all the javascript that their browser might run to ensure that it’s not doing something malicious, so they should be able to disable it and still function online.

                                                    why is a “classic” forum like fluxbb not considered an alternative to discourse/nimforum?

                                                    1. 2

                                                      Honestly, the only differences between classic forums and Discourse I’ve ever noticed are (1) the default Discourse theme is “modern looking” [meh] (2) Discourse integrates very well with email and is basically a fancy mailing list archive where you can choose to get only some threads or categories by email [very good]

                                                      1. 2

                                                        ah so you can post via email? that does seem useful.

                                                1. 1

                                                  It’s not listed in the features and I can’t load the demo… does this support receiving all forum messages by email and replying by email? I consider those the killer features that set discourse apart from other forums

                                                  1. 2

                                                    You should look at D language forum’s source for that. It is an NNTP / mailing list web frontend / forum software, news aggregator and IRC bot in one.

                                                    1. 1

                                                      Afraid not. That would indeed be a very nice feature.

                                                    1. 2

                                                      How much Nim should one know in order to be able to maintain an instance? I tried setting up a Discourse server and found it somewhat onerous - even knowing JS and Rails.

                                                      1. 1

                                                        There should be no knowledge necessary. If you want some advanced customisation of the produced HTML then you may need to dive into the code, but otherwise my aim is to just give you two executables, one for the backend and one for the initial set up.

                                                        My main priority so far was to get forum.nim-lang.org up and running. I also wanted to gauge interest to see if people would actually like to use this instead of Discourse. My objective in the long run is to provide release tarballs to spare the trouble of installing the whole Nim ecosystem. If there is interest I will certainly do that.

                                                      1. 2

                                                        How does one properly back up a SQLite based application like this? Regular DUMP to text files and then put it in S3 or somesuch?

                                                        1. 12

                                                          There are two options - a shared lock, or the online backup API

                                                          https://sqlite.org/backup.html describes both.

                                                          1. 4

                                                            Much better answer than mine. I’m going to downvote myself.

                                                            1. 1

                                                              Thanks for sharing this link. I have been using the “copy” method described by @akkartik for years with no issues, but I can understand why that is risky. I’ll have to look into implementing this in the NimForum.

                                                            2. 1

                                                              You can literally just copy the .sqlite3 file(s).

                                                              “A complete database is stored in a single cross-platform disk file. Great for use as an application file format.” (https://www.sqlite.org/features.html)

                                                              1. 1

                                                                How does that work? As in, how do you guarantee that the DB is in a consistent state when you do the copy? Or for a large DB how do you guarantee that the state won’t change DURING a copy?

                                                                1. 2

                                                                  Oh yes you have to bring it down to ensure consistency. But that would also be true for the options you listed above.

                                                                  1. 2

                                                                    I didn’t see any options listed by @feoh, but you probably already know this but I’ll say it for others: DBs like PostgreSQL, Cassandra, Riak, etc provides mechanisms to do backups without stopping your application. At an administrative cost, though.

                                                                    1. 2

                                                                      It’s a nonissue, lvm volumes can do live snapshots of ext4 filesystems, so can zfs and btrfs and others. Very easy to do live backups of sqlite with no downtime. Sqlite itself has no problem with snapshots as it is designed to be resilient to power failure, which is what that would look like.

                                                                      1. 1

                                                                        I was referring to “Regular DUMP to text files and then put it in S3 or somesuch?”

                                                              1. 5

                                                                Looks really cool, there are way too little alternatives to Discourse and I hope most developers/admins will agree - that mailman or hyperkitty never managed to become a decent web-application (with, or without JavaScript).

                                                                A link to forum.nim-lang.org in the git repo would be nice, though. :-)

                                                                The rst-syntax example page is interesting, as we’ve learned on 1st April on @lobsters, you want to scrape/mirror/resize/convert foreign image embeddings.

                                                                1. 5

                                                                  Thanks for the feedback, I added a little link below the image to forum.nim-lang.org.

                                                                  Indeed, this issue regarding foreign image embeddings didn’t even pop into my head. I shall make a note of it and hope nobody embeds a huge image in the meantime :)

                                                                  1. 3

                                                                    Sure! :-)

                                                                    Ah, completely missed that the image is a link to the forum, but now it’s better - might become a longer list, once more projects are using NimForum :-).

                                                                    PS: Maybe one could get you a lobsters “nim-hat”.

                                                                1. 4

                                                                  I’ve really enjoyed writing in Nim for this year’s Advent of Code puzzles. Its type inference support enables static typing, which I find comforting, with the clean syntax of a dynamic language like Python. In fact the syntax is largely similar to Python. Love that it compiles to C like a “real program”, and I’m interested to try out its JavaScript compilation backend.

                                                                  1. 1

                                                                    Glad you’re enjoying the language :)

                                                                    Be sure to pop into #nim on Freenode (or Gitter or Discord) if you’ve got any questions.

                                                                  1. 4

                                                                    Can anyone familiar with Nim comment on the quality of the contents? I like the “in Action” part as it shows real examples but would like to learn idiomatic language if possible.

                                                                    1. 5

                                                                      dom is being a bit modest below - in addition to being the author of the book, he’s also the second-most prolific contributor to the language itself and has written much of the core tooling besides. Which is to say—you can trust that you’re learning idiomatic language from him because he wrote the idiom.

                                                                      1. 2

                                                                        Excellent reply! That’s what I wanted to hear. Thank you.

                                                                      2. 4

                                                                        Author here. Unfortunately I cannot comment on the quality as I am biased. But the book does show many practical examples and thus teaches you the idiomatic way to do things. Hope that helps :)