1,261 karma · joined February 15, 2024
That is, it rhymes with Harry, Larry, carry, parry, tarry, and marry, rather than... uh, starry, I guess?
I agree that the tool I sketched wouldn't let your .h file contain macros, nor C99 inline functions, nor is it clear how it would distinguish between structs whose definition must be "exported" (like sockaddr_t) and structs where a declaration suffices (like FILE). But:
- Does our hypothetical programmer care about those limitations? Maybe he doesn't write libraries that depend on exporting macros. He (counterfactually) wants this tool; maybe that indicates that his preferences and priorities are different from his contemporaries'.
- C++20 Modules also do not let you export macros. The "toy" tool we can build with 1970s technology happens to be the same in this respect as the C++20 tool we're emulating! A modern programmer might indeed say "That's not a useful software engineering tool, because macros" — but I presume they'd say the exact same thing about C++20 Modules. (And I wouldn't even disagree! I'm just saying that that particular objection does not distinguish this hypothetical 1970s .h-file-generator from the modern C++20 Modules facility.)
[EDIT: Or to put it better, maybe: Someone-not-you might say, "I love Modules! Why couldn't we have had it in the 1970s, by auto-generating .h files?" And my answer is, we could have. (Yes it couldn't have handled macros, but then neither can C++20 Modules.) So why didn't we get it in the 1970s? Not because it would have been physically difficult at all, but rather — I speculate — because for cultural reasons it wasn't wanted.]
For Kant, and therefore for Schopenhauer, the visible world is composed merely of objects, which are by definition only mental representations: a world of objects "exists" only in the mind of a subject. If there is a Thing-in-Itself (which even Kant does not doubt, if I recall correctly), it certainly cannot be a mental representation: the nature of the Thing-in-Itself is unknowable (says Kant) but certainly in no way at all like the mere object that appears to our mental processes. (Schopenhauer says the Thing-in-Itself is composed of pure Will, whatever that means.) The realest world is "behind" or "below" the visible one, completely divorced from human reason, and by definition completely inaccessible to any form of cognition (which includes the sensory perception we share with the animals, as well as the reason that belongs to humans alone). The Third Man paradox makes no sense at all for Kant, first because whatever the ineffable Thing-in-Itself is, it certainly won't literally "partake" of any mental concept we might come up with, and secondly because it would be a category error to suppose that any property could be true of both a mental object and a thing-in-itself, which are nothing alike. (The Thing-in-Itself doesn't even exist in time or space, nor does it have a cause. Time, space, and causality are all purely human frameworks imposed by our cognitive processes: to suppose that space has any real existence simply because you perceive it is, again, a category error, akin to supposing that the world is really yellow-tinged just because you happen to be wearing yellow goggles.)
I disagree. In fact, I would expect the following could be a pretty reasonable exercise in a book like "Software Tools"[1]: "Write a program to extract all the function declarations from a C header file that does not contain any macro-preprocessor directives." This requires writing a full C lexer; a parser for function declarations (but for function and struct bodies you can do simple brace-matching); and nothing else. To make this tool useful in production, you must either write a full C preprocessor, or else use a pipeline to compose your tool with `cpp` or `gcc -E`. Which is the better choice?
However, I do see that the actual "Software Tools" book doesn't get as advanced as lexing/parsing; it goes only as far as the tools we today call `grep` and `sed`.
I certainly agree that doing the same for C++ would require a full-blown compiler, because of context-dependent constructs like `decltype(arbitrary-expression)::x < y > (z)`; but there's nothing like that in K&R-era C, or even in C89.
No, I think the only reason such a declaration-extracting tool wasn't disseminated widely at the time (say, the mid-to-late 1970s) is that the cost-benefit ratio wouldn't have been seen as very rewarding. It would automate only half the task of writing a header file: the other and more difficult half is writing the accompanying code comments, which cannot be automated. Also, programmers of that era might be more likely to start with the header file (the interface and documentation), and proceed to the implementation only afterward.
[1] - K&P's "Software Tools" was originally published in 1976, with exercises in Ratfor. "Software Tools in Pascal" (1981) is here: https://archive.org/details/softwaretoolsinp00kern/
If the comment must be addressed before the review is approved, then it is not a nit, it is a blocker (a "changes required"). Blockers should not be marked as nits — nor vice versa.
I agree that prefixing comments with "Nit:" (or vice versa in extreme cases "This is a big one:") is psychologically useful. Yet another reason it's useful is that it's not uncommon for perceived importance to vary over time: you start with "hmm, this could be named blah" and a week later you've convinced yourself it's a blocker — so, force yourself to recognize that it was originally phrased as a nit, and force yourself to come back and say explicitly "I've changed my mind: I think this is important." With or without the "nit/blocker" prefixing pattern, the reviewer may come off as capricious; but with the pattern, he's at least measurably capricious.
I made a simpler take on "challenging Wordle" some years ago: https://quuxplusone.github.io/wordle-clone/evirdle/ (Try "easy mode" too!)
I highly recommend the panel show "What's My Line," on which he was a regular panelist from 1951 to 1967.
Instead we get an example from the Bible (Psalms 100:4), displaying characteristic parallelism but still with perfectly modern sentence structure: "Enter into his gates with thanksgiving, and into his courts with praise: be thankful unto him, and bless his name."
And then we get a new section heading, "Modern English emerges with bibles in the sixteenth and seventeenth centuries," quoting an identically constructed sentence from the same Bible (Acts 4:8–9): "Ye rulers of the people, and elders of Israel, [consider] the good deed done to the impotent man, by what means he is made whole," etc.
If there's any distinction to be made there, surely it's that the former quotation is from Hebrew and the latter from Greek — but then isn't it rather a little surprising that the exact same rhetorical device, this specific type of parallelism, should be used, than that there should be anything different about the structure of these two verses? But then — guess what — there's nothing different about their structure at all!
So what's the deal with that whole section (or pair of sections), and what actually is the author's thesis? What is the "great shift" mentioned in the headline?
If the thesis is that there was some big shift in sentence structure circa 1600, I'd say it's just demonstrably wrong. Look for example at Chaucer, circa 1400: https://chaucer.fas.harvard.edu/pages/tale-melibee-0 Nothing unusual about those sentences, is there?
But re the distinction at the end of TFA — that a garbage char is slightly more OK than a garbage bool — that's also intuitive. Eight bits of garbage is always going to be at least some valid char (physically speaking), whereas it's highly unlikely that eight bits of garbage will happen to form a valid bool (there being only two valid values for bool out of those 256 possible octets).
This also relates to the (old in GCC but super new in Clang, IIUC) compiler option -fstrict-bool.
https://archive.org/details/MilmanParryTheMakingOfHomericVer...
It's pretty common to see a single em-dash for the comma-like parenthetical usage (p6 etc.) and a double em-dash for the "someone's dialogue was interrupted and cut off" usage (p15).
The "I'm redacting this name" usage (p11) often uses two em-dashes too, although Wodehouse('s typesetter) doesn't in this case.
https://books.google.com/books?id=c6MIAAAAQAAJ&pg=PA86
https://languagelog.ldc.upenn.edu/nll/?p=20844
But if I understand https://news.ycombinator.com/item?id=46395467 correctly, this em-dash broadside was itself AI-generated, so any similarity to the above might be completely unintended by the human who wrote the prompt. (Anyway, the similarity is superficial or spiritual at best.)
try { f(p.get()); (void)p.release(); } catch (...) { /* f threw; don't release p after all */ }
Whatever "this platform" is, it's apparently run by someone named Herman.
But then, because no theology of ineffable Beings is really quite complete unless we pretend we can eff them anyway, the sophist can go on to produce a plausible justification for the virtual-clone-torture thing. See, by precommitting (even before its own birth) to torture virtual clones of unbelievers and shirkers, the Basilisk would discourage believers from becoming apostates, and encourage them to work to produce the Basilisk (because if they apostasized or shirked, they'd get tortured — or at least virtual clones of them would, and nobody can prove they're not already a virtual clone). So, the Basilisk has this mechanism to (retroactively) encourage its own creation as quick as possible. Now, why would it want to be speedily created? Well, because it's superbenevolent, of course! The sooner it's created, the sooner it can start assisting... humanity, I guess, or whoever it's supposed to be superbenevolent towards. Anyway, it's not supposed to be superbenevolent toward virtual clones, right? so that part isn't even a contradiction.
The weakest part of this argument, to me, is that Roko's Basilisk works only against believers; it can discourage apostasy and shirking, but I don't see how it can generate new believers. Even someone predisposed to believe that human actions today might lead to superintelligent superbenevolent AI in the future, I'd think, would likely not be predisposed to believe in the additional apparatus of virtual clone torture that the Basilisk argument requires. The whole thought-experiment, it seems to me, "could hardly be consciously designed to appeal to the average unsophisticated reader." But that's just my own failure of imagination: obviously plenty of even weirder religions have successfully caught on.
Likewise, if someone thought the pieces couldn't be moved, you could idly wiggle the king pawn as a hint to pick it up.
Now, how anybody could look at a chess board and think the pieces were immovable, or look at a 3D torus render and think it was unrotatable, is beyond me. But if it's a real problem, I think idle animation is a good fix.
(But would further gamification make it more enjoyable? No, IMO. So maybe all we learn here is that people don't like change in any direction.)