This is not a good example of gaslighting. If you look at the actual book cover and you see that, then it's very telling. If you look at the image on the blog post and see it, it's different. The book cover images are missing quite a bit of it and the parts where it cuts off are quite import to an illusion.
It may not be obvious if you're just looking at the book. But if the images of the front and back are put together side by side, like in the post, I think it's quite obvious. I'd be surprised if this wasn't intentional.
That's pretty telling for the creator and community to think that way. Nim doesn't have a great ecosystem, but this really doesn't help sell it either.
It's like that episode of Everybody Loves Raymond where Ray's mom (Marie Barone) creates a sculpture that looks like a womb area, and only Ray and his wife can immediately see the ... hidden image, and Ray's dad (Frank Barone) for some reason is very drawn to the sculpture and he can't quite put his finger on it. After Ray, lets his mom know, then she can't unsee it.
I think you mean “female nude” not “explicit” here.
They aren't synonyms; “implied explicit” is an oxymoron, “implied female nude” is not. (Thouugh really, “suggestive of” or “evocative of” is probably more accurate than “implied” here, too.)
Yes, and? Presumably the uncited cut-and-paste from a (poor, IMO) dictionary is intended to suggest that the third definition applies, but nudity isn't sexual activity [0] and, more to the point, the sense of “graphic” in the that definition is basically a combination of vivid and explicit in the sense of the first definition, and remains an antonym of “implied”.
[0] which is more of a problem with your choice of authority, because most dictionaries wouldn't limit the relevant definition this way.
Copied from Google (who pull from Oxford), but a variation of "depicting nudity or sexual activity" is included in most if not all definitions. Do you have a source you prefer that contradicts this?
In common usage, an "explicit image" implies the third definition. It's not explicit as opposed to blurry or abstract, it's explicit as opposed to non-sexual. Since the context was discussion of the contents of an image, the word "image" was implied.
Ironic that a statement about an ambiguous image that might be misinterpreted to be something it is not has spurred such a rousing discussion about the ambiguity of the comment itself, which may be misinterpreted to mean something it is not saying.
My beloved goddess, I wish to roam around your lush forests and valleys, and scale the peaks of programming ecstasy with you my most beautiful goddess.
I yearn to plough the depths of your fertility, planting my seeds into your fertile soil, and watch the seedlings sprout and grow into great giant oaks of Mandelbrot complexity and beauty.
I want to bathe in your flowing rivers of ectasy, raise my face to the sky and feel the spray of your golden showers on my face, drink your golden ambrosia and feel the wisdom of your inspiration flow through my veins into my fingers, weaving skeins of golden code that induce envy in the greatest weavers of code.
Oh beloved Goddess Nim, my programming muse.
Bruh!!
.....
I ought to stop here before I cause a global crisis of PEKBACs among diehard Nim programmers.
TBH, I didn't see it at first, but those beautiful mountain peaks and valleys have converted me into a diehard Nim programmer.
PS. Should I post this on the Nim Slacks, Reddits, Matrixes et al?
As other commenters have noted, this is a stretched across the front and back. It makes me think this illusion was not intended and is more an artifact of having a mirrored image so that the back is a reflection of the front. I don't see any issue with the book cover as it appears on the linked Amazon page, for example.
A tongue-in-cheek motto for Nim is "One language to rule them all". While the statement is debatable (with a strong set of arguments for), it's hard to deny what a great fit Nim is for Advent Of Code (and other related sets of problems, such as Project Euler).
The community is sharing and discussing their solutions on the forums[0] and in the dedicated matrix room[1].
The limited scope of individual problems makes them great to see the language in action, compare different approaches and asses how its syntactic weaponry and standard library can help solving the tasks at hand quickly and efficiently.
Title should probably be "Mastering Nim, 2nd edition", since that's the title of the linked page. It's a short blog that sends you to a book on Amazon: https://www.amazon.com/dp/B0B4R7B9YX
because nim is not a c replacement, nim is more in the go or d python replacement replacement , meaning, in the compiled languages that want to replace python category
It is undeniable that, of all these, the most common "first prog.lang (PL)" is Python. So, to the extent a new PL "replaces what you already know" almost everything is a Python replacement. (It's a bit muddy since so much Python just wraps C/C++, though, and you might be replacing someone else's code.) Personally, I use Nim as a C replacement - it responds very well to optimization effort in my experience.
It really depends on _what_ you want to replace, as in the application you have. Nim is great for micro-controller programming typically done in C for example. Since it has painless interop with C it also comfortably uses C libraries, so you don't have to rewrite all your C code.
I want to get into Nim but I think the language is way too verbose for my taste. It's so similar to spoken English, even compared to Python, that it enters some sort of uncanny valley which makes reading Nim code give me a headache.
There may be compensating syntactic factors in the large to English word bitwise & boolean operators in the small -- such as being able to skip parentheses in command-style function call syntax and define your own operators (to bring back brevity surgically) that are even implemented as templates or macros. Maybe you can have it all? { famous last words when trade-offs rear their heads :-) }. Personally, whenever I switch from Nim to any other PL (except maybe Unix shell) things always feel much more verbose.
EDIT: For example, say you want Python's Walrus operator. You can just do this (although you can often just use a slightly more verbose parenthesized `let` expression):
proc `:=`*[T](x: var T, y: T): T = (x = y; x)
or maybe you want `myvar |= flag` like in C/Python. You can also do that:
proc `|=`*[T, U](a: var T, b: U) = (a = a or b)
But both of those could also be templates or macros that get the whole AST, can pick the AST apart, and emit whatever Nim code you actually want.
In fact, since Nim has nicely nested scopes & hygienic templates, you can define a bunch of operators in a library `template`, called say `unsafePtrArith` for pointer arithmetic, import that and then make them available in a little sub-scope to your code like:
In my experience, Nim macros (but not templates) can succumb to verbosity in their implementations because manipulation of the AST is generally imperative and can become quite involved in the details of syntax nodes.
Other than that, with the expressiveness of type definitions in Nim, my experience has been that routines often end up short and dry. Learning to wield helpers such as {.push.} and {.pop.} can be helpful in that regard, just depends on what you’re doing.
I've enjoyed building things in Nim. I picked it up by building small CLIs, and then eventually by starting a 3D game engine project in Nim. It's the language that I wish would take off already.
I think Nim is great for small CLIs. Some examples are over at: https://github.com/c-blake/bu . To quantify "small", using tools themselves in bu/ (and Zsh *):
I was considering learning Nim. Then I found out about its partial case insensitivity and ignoring of underscores in identifiers. And that was the end of my interest in Nim.
“Nimrod” was, to my knowledge, a biblical reference:
Cush was the father of Nimrod, who became a mighty warrior on the earth. He was a mighty hunter before the Lord; that is why it is said, “Like Nimrod, a mighty hunter before the Lord.” The first centers of his kingdom were Babylon, Uruk, Akkad and Kalneh, in Shinar. From that land he went to Assyria, where he built Nineveh, Rehoboth Ir, Calah and Resen, which is between Nineveh and Calah – which is the great city.
My biggest problem with Nim is that it did not pick its niche. It tries to be everything to everyone and does not really have strong foundations for your average programmer to use it in Prod.
There is not really an ergonomic, performant http server that people converged to.
Anything production quality is mostly from Status.im and people like Treeform and Guzba who also have a production use case.
Its greatest strength at present, and for a long while, has been serving as an “expert’s tool”.
If you want to do systems programming with less hassles than C/++ (you understand them well), you appreciate the limits and pitfalls of AMM (and you don’t want/need Rust’s borrow checker), and you’re into metaprogramming, well then Nim is a great tool for your toolbox.
It can also serve newcomers to programming decently well and enables DSLs such as Enu ( http://getenu.com/ ). But it doesn’t take too long reading the Nim Manual and std lib docs to realize that a big focus is putting a power tool into the hands of developers who already understand the ins and outs of systems programming.
This is all, of course, my personal take on it, other Nim users may disagree.
The big weakness now is the transition to 2.0 and all the old docs floating around that are obsolete. It's hard to find info on what the new idiomatic approach is for things that have changed. I had to port some pre-1.0 code a little while back and was puzzled for a bit about resolving various (justified) deprecation warnings.
Mastering nim is not intended as the intro or main docs for Nim. It's intended as bonus docs for more experienced users, FWICT. Generally, people start with the resources listed here: https://nim-lang.org/documentation.html, especially the official tutorials. There's also this unofficial resource: https://ssalewski.de/nimprogramming.html
I use Nim at work. I've built a backend CLI program that processes signal data collected from instruments. That CLI program is used in many contexts, but is primarily called through a PHP API by many of our web services. The executable has no dependencies (compiled with musl-libc and statically-compiled libraries).
Modeling problems is almost as powerful as a Lisp: It prefers stack allocation, immutable data, and referentially transparent procedures, but all of that can be short-circuited when necessary. The type system is simple and clear. The syntax is Pythonic and easy to make readable and self-documenting. Magic is not required. The Datamancer data frame library is incredibly robust. The standard library is quite extensive, and the included JSON data structure functions well as a dynamic, heterogenous structure when needed. Turning Nim objects and data into JSON is so trivially easy that it's a no-brainer for my use case, and probably web-focused use cases as well. Nimja templating is incredibly good and great for building pages or documents, so long as you're preprocessing as much as possible (as with most templating libraries). C interop is also trivially easy, requiring no more than a function signature in most cases.
I can absolutely say that Nim has been a secret weapon for tackling the specific data processing problem I've been solving. Highly recommended, especially if you can invoke it from the CLI using other languages to solve things such as UI. I'm building an Electron app around it currently, and the NodeJS backend invokes my Nim program.
It has a very rudimentary REPL in the form of `nim secret`; however, the compiler internals are being revamped a bit in the coming versions to make room for full-featured incremental compilation and REPL support.
Sorry, to answer your question about data exploration, quite good. Reading files is a single procedure call which slurps into strings. Parsing JSON (or Datamancer parsing CSV) is a single procedure call. Nim objects and most compound data structures such as JsonNodes and DataFrames have printing support build in, using the `$` proc which is the language's equivalent to `toString()` and should be defined on every type possible. In short: It's great.
- [0] `nim secret` : code is interpreted with Nim's vm. It is limited to compile-time evaluations (e.g. no C/C++ interop).
- [1] `nlvm r` : nlvm backend supports JIT compilation and repl-like interface was added in latest release.
- [2] inim : supports all nim code, but it's not really a true repl. It adds code to a file and recompiles it (you can see the source file with `ctrl+x`). I'd recommend to use it with clang compiler, because it's a bit faster than gcc in my experience. It's the best option right now. And I use it almost daily.
First two options have rudimentary input system. But you can get command history and left-right navigation by wrapping them with rlwrap (should be preinstalled on most *nixes): `rlwrap nim secret`, `rlwrap nlvm r`.
There are plans to support incremental compilation for the next Nim release (it is currently broken). That would improve inim and other repls experience significantly.
> The Datamancer data frame library is incredibly robust.
Thank you for the kind words! :) Especially given that it's a one-man side-project always makes me a bit worried people will stumble over all sorts of issues.
The only thing I could ask for is categorization in the API docs. They're a bit hard to search or discover. Some of that is just the Nim automatic docs though. Other than that, fantastic library.
The first time I ran into Nim in the wild was when contributing to Exercism [1], specifically the configlet tool [2] for managing language tracks. It looks like it was created at the end of 2020 [3].
85 comments
[ 6.5 ms ] story [ 147 ms ] threadits not technically explicit, but its implied
Choices like this could alienate a large number of potential Nim programmers, and make me question the tone and nature of the community.
> it's more telling about you than anyone else
I'll reflect this back to you and your statement. Making such statements says quite a bit about how you see and treat people
I'd also note that I did write I didn't see it the first time, and only saw it after another commenter pointed it out. (https://news.ycombinator.com/item?id=38544483)
part 2 addresses the personalization of the accusation
But I also don't care, it doesn't bother me at all.
What I suspect is you haven't looked at a picture of the actual book cover and therefore haven't realised that it looks rather different in action.
and it is usually how those visual illusions are used, if you see this than you are that, but if you see the other thing you are normal
its a bad image, it is a visual illusion, are they aware of it or not this is the question
"this is not an explicit image of looking up a woman's body, but it is implied"
I take issue with the but part, which "implies" it was intentional. I'm not in a place to judge that, but I can definitely see the "implied" imagery
... if we can further mix the connotations of the words from the comment we are talking about, without increasing confusion...
how intentional I will let the crowd decide
Hilarity ensues.
They aren't synonyms; “implied explicit” is an oxymoron, “implied female nude” is not. (Thouugh really, “suggestive of” or “evocative of” is probably more accurate than “implied” here, too.)
ex·plic·it
/ikˈsplisət/
* stated clearly and in detail, leaving no room for confusion or doubt.
* (of a person) stating something in a clear and detailed way.
* describing or representing sexual activity in a graphic fashion.
[0] which is more of a problem with your choice of authority, because most dictionaries wouldn't limit the relevant definition this way.
In common usage, an "explicit image" implies the third definition. It's not explicit as opposed to blurry or abstract, it's explicit as opposed to non-sexual. Since the context was discussion of the contents of an image, the word "image" was implied.
Ode to my most beautiful Goddess Nim.
My beloved goddess, I wish to roam around your lush forests and valleys, and scale the peaks of programming ecstasy with you my most beautiful goddess.
I yearn to plough the depths of your fertility, planting my seeds into your fertile soil, and watch the seedlings sprout and grow into great giant oaks of Mandelbrot complexity and beauty.
I want to bathe in your flowing rivers of ectasy, raise my face to the sky and feel the spray of your golden showers on my face, drink your golden ambrosia and feel the wisdom of your inspiration flow through my veins into my fingers, weaving skeins of golden code that induce envy in the greatest weavers of code.
Oh beloved Goddess Nim, my programming muse.
Bruh!!
.....
I ought to stop here before I cause a global crisis of PEKBACs among diehard Nim programmers.
TBH, I didn't see it at first, but those beautiful mountain peaks and valleys have converted me into a diehard Nim programmer.
PS. Should I post this on the Nim Slacks, Reddits, Matrixes et al?
The community is sharing and discussing their solutions on the forums[0] and in the dedicated matrix room[1].
The limited scope of individual problems makes them great to see the language in action, compare different approaches and asses how its syntactic weaponry and standard library can help solving the tasks at hand quickly and efficiently.
[0]: https://forum.nim-lang.org/t/10717
[1]: https://matrix.to/#/#nim-aoc:matrix.org
> Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula.
I've seen plenty such projects omitting this on their homepage, but it seems odd to expect it of every deeplink.
Only "mainstream" app I know that runs Nim is Nitter.net
zig and rust are the real c replacement
At least one developer is calling more optimized Nim from Rust.. https://forum.nim-lang.org/t/10532
EDIT: For example, say you want Python's Walrus operator. You can just do this (although you can often just use a slightly more verbose parenthesized `let` expression):
or maybe you want `myvar |= flag` like in C/Python. You can also do that: But both of those could also be templates or macros that get the whole AST, can pick the AST apart, and emit whatever Nim code you actually want.In fact, since Nim has nicely nested scopes & hygienic templates, you can define a bunch of operators in a library `template`, called say `unsafePtrArith` for pointer arithmetic, import that and then make them available in a little sub-scope to your code like:
orIn my experience, Nim macros (but not templates) can succumb to verbosity in their implementations because manipulation of the AST is generally imperative and can become quite involved in the details of syntax nodes.
Other than that, with the expressiveness of type definitions in Nim, my experience has been that routines often end up short and dry. Learning to wield helpers such as {.push.} and {.pop.} can be helpful in that regard, just depends on what you’re doing.
Cush was the father of Nimrod, who became a mighty warrior on the earth. He was a mighty hunter before the Lord; that is why it is said, “Like Nimrod, a mighty hunter before the Lord.” The first centers of his kingdom were Babylon, Uruk, Akkad and Kalneh, in Shinar. From that land he went to Assyria, where he built Nineveh, Rehoboth Ir, Calah and Resen, which is between Nineveh and Calah – which is the great city.
— Genesis 10:8-12
https://forum.nim-lang.org/t/9591#63054
There is not really an ergonomic, performant http server that people converged to.
Anything production quality is mostly from Status.im and people like Treeform and Guzba who also have a production use case.
If you want to do systems programming with less hassles than C/++ (you understand them well), you appreciate the limits and pitfalls of AMM (and you don’t want/need Rust’s borrow checker), and you’re into metaprogramming, well then Nim is a great tool for your toolbox.
It can also serve newcomers to programming decently well and enables DSLs such as Enu ( http://getenu.com/ ). But it doesn’t take too long reading the Nim Manual and std lib docs to realize that a big focus is putting a power tool into the hands of developers who already understand the ins and outs of systems programming.
This is all, of course, my personal take on it, other Nim users may disagree.
It's effectively free to distribute after all
For a language developer to charge for a book about that language, I think that's a completely valid way to make some money off of their work.
Even the Rust book, "The Rust Programming Language" is available freely online [0], but also as a print and ebook for sale via NoStarchPress [1].
[0] https://doc.rust-lang.org/book/
[1] https://nostarch.com/rust-programming-language-2nd-edition
I'd prefer a GitHub repo with examples over this. At least that can be easily updated
EDIT: In particular, the "Nim for X Programmers" pages seem popular.
I'll check this out this weekend.
Modeling problems is almost as powerful as a Lisp: It prefers stack allocation, immutable data, and referentially transparent procedures, but all of that can be short-circuited when necessary. The type system is simple and clear. The syntax is Pythonic and easy to make readable and self-documenting. Magic is not required. The Datamancer data frame library is incredibly robust. The standard library is quite extensive, and the included JSON data structure functions well as a dynamic, heterogenous structure when needed. Turning Nim objects and data into JSON is so trivially easy that it's a no-brainer for my use case, and probably web-focused use cases as well. Nimja templating is incredibly good and great for building pages or documents, so long as you're preprocessing as much as possible (as with most templating libraries). C interop is also trivially easy, requiring no more than a function signature in most cases.
I can absolutely say that Nim has been a secret weapon for tackling the specific data processing problem I've been solving. Highly recommended, especially if you can invoke it from the CLI using other languages to solve things such as UI. I'm building an Electron app around it currently, and the NodeJS backend invokes my Nim program.
- [0] `nim secret` : code is interpreted with Nim's vm. It is limited to compile-time evaluations (e.g. no C/C++ interop).
- [1] `nlvm r` : nlvm backend supports JIT compilation and repl-like interface was added in latest release.
- [2] inim : supports all nim code, but it's not really a true repl. It adds code to a file and recompiles it (you can see the source file with `ctrl+x`). I'd recommend to use it with clang compiler, because it's a bit faster than gcc in my experience. It's the best option right now. And I use it almost daily.
First two options have rudimentary input system. But you can get command history and left-right navigation by wrapping them with rlwrap (should be preinstalled on most *nixes): `rlwrap nim secret`, `rlwrap nlvm r`.
There are plans to support incremental compilation for the next Nim release (it is currently broken). That would improve inim and other repls experience significantly.
[0]: https://nim-lang.org/docs/manual.html#restrictions-on-compil...
[1]: https://forum.nim-lang.org/t/10697
[2]: https://github.com/inim-repl/INim
Thank you for the kind words! :) Especially given that it's a one-man side-project always makes me a bit worried people will stumble over all sorts of issues.
[1] https://exercism.org/
[2] https://github.com/exercism/configlet
[3] https://github.com/exercism/configlet/commit/68f130a543757ab...