481 karma · joined June 22, 2010
I think my reaction comes from the dissonance between people saying "Deno is the best thing ever for CLI apps!" then following up with "Here are the ways it's better than Node!", without acknowledging all the other scripting languages out there. But I think I need to read that first line as having an implicit "...in the JS/TS ecosystem", and then it all makes sense.
Since clearly one of Deno's draws is that it improves on the package management of Node, I was wondering why JS projects so often end up with such a long list of dependencies, compared to the Python/Go/C++ projects that I'm more familiar with. That's probably explained just by NPM making it easy, so people did it. (Sort of like how Java grew convoluted DI schemes because OO + GC + reflection made it possible.)
One of these days I should learn more JS than having read through the Good Parts once. :-)
In Python, I find I can do most things I want with the standard library plus a handful of well-known packages, so even just downloading the tarballs and installing manually isn't all that onerous.
Why do I want a "browser for code"?
I may just be out-of-touch, as a purely backend/machine-learning/quality engineer. Clearly, this is a real need in the front-end / JavaScript space, but coming from the outside I just don't quite understand yet the value proposition here. Can anyone explain?
That probably suggests there's an urban / suburban divide, too, where the people with enough real estate to set up a full-on home office are much happier with the results. I don't even know where I'd stick a 27" monitor if I ordered one.
And yes, you can argue that using "+" implies commutative, and I can see that, but I think it's still a plausible meaning in this context.
(I'm probably rabbit-holing here, but it's interesting.)
Also it has (or had, maybe they fixed it) a bunch of weird quirks, like "sum foo" skipping all the NAs in a list while "+/foo" didn't, resulting in NaN. (Or maybe it was +/ over an int array didn't work while a double array did. I forget.) Arrays of dicts were immediately turned into tables, which didn't work the same as an array of dicts, etc.
But, yeah, it's not crazy implementing things in q/K, as long as they're mostly linear things. Trees are hard, iterative methods are hard, and it's really hard to skim code, other than to just rely on names and comments.
I agree that we don't need coordinates. Things are things.
But what always got me about the geometric algebra stuff was that they used bivectors for areas, which seems like the wrong thing. If you're integrating a vector field over it, you want a 2-form, not a bivector. I suppose the distinction doesn't matter as long as you're just in Euclidean space, but even then, if you need to drop down to coordinates and do the actual integral, you're still going to want to have changes of variables that work. That leaves me with a kernel of doubt that they're doing the right thing.
If you have a displacement vector, and a potential gradient, they can't be the same "kind" of thing (i.e. both vectors), because their dot-product should be preserved. If the slope gets half as long, it's twice as steep.
Another fun fact is that the magnetic field energy density alone near the surface of a pulsar (1e12 gauss and up) is about that of lead. (~40 g/cm^3).
Someone (I forget who) had a critique about dynamic-wind itself that (IIRC) involved capturing continuations from within the before- and after-thunks of dynamic-wind, but that seems more like an edge case.
I remember from back in the Scheme R5RS era there was a conflict between call/cc and dynamic-wind.
If you have a dynamic extent (like for example a try {} finally {} block that does resource allocation/deallocation), and you exit, but then jump back into the block, how far do you try to re-wind the state? You probably don't re-open files, but you would probably want to re-set any dynamic-scoped variables.
I don't remember seeing this raised as an issue recently, so it must have been solved somehow, and I'm just wondering how.
I'm in that age of folks that did pascal in high school, C and Scheme in college, C++ and python in grad school while futzing around with ocaml and common lisp and sather and other fun things. Programming languages are fun.
But, oh, I have so much other stuff to pay attention to. I write C++ a few days a week, which is barely enough to keep move semantics in my head. I also write SQL and analysis docs and internal DSLs and configuration files and python.
At this point, C++ is barely earning its keep, in terms of mental complexity for reward. Go feels a lot nicer, since I can just get in, do my thing, get out, and it'll at least work and give me a compile error if one of the APIs change when I don't look at it for a year.
I'm not about to jump into rust.
So, at least for me, go hits a pretty good sweet spot.
[Edit: I'm not trying to point fingers at rust in particular. It looks fun. If I weren't still working on getting my hobbyist-Haskell better, I'd probably be playing with it. But that would be at home, for fun, not where I have to have the thing in my head for production issues.
It reminds me a bit of the old statement about perl, that it was a fantastic language if you used it every day, but not if you don't. And I don't get to use these things every day any more.]
Whole Foods 365 brand organic milk is slightly cheaper than CVS, but it's a slightly longer walk and has longer lines and is in a basement, so I tend not to bother. (I probably should go there more often.)
I know the problem, and I've danced around this same issue in things like Haskell with strictness annotations, and I've run into the same problem in R, but I'd like to just be able to read and parse a ~1GB CSV file without blowing out RAM with a giant list of thunks.
This was many years ago now, so maybe they've fixed it, but I'm tired of fighting that particular battle.
However, I do jump between discussing if a trie is the right way to implement something, discussing whether the "simple" model should be a SVM or boosted tree, trying to figure out if we've covered the major abuse angles in our product, coordinating with all the other teams we're collaborating with, analyzing the experiment results, etc, etc.
Having at least some actual CS certainly helps fill in the gaps, even if it's not what I'm doing most of the time.
The logic is that often the specs don't change, and if you make the code concise enough, you can just rewrite it if you need to make it more general.
For a while there was a freely downloadable version to try out, and you can look at "q for mortals", http://code.kx.com/q4m3/, to get some flavor.
Around that time, we moved much of the mortgage models over to kdb and q, which was fun. Lots of weird dark little corners in that language. (List of dicts? Nope! It's a table now! 'sum x' drop NAs, while 0+/x was NA if any value was NA, but maybe only for ints, not floats, etc. Ugh.)