<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: justinpombrio</title><link>https://news.ycombinator.com/user?id=justinpombrio</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 27 Aug 2026 10:27:24 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=justinpombrio" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by justinpombrio in "Computation as a universal and fundamental concept"]]></title><description><![CDATA[
<p>There's no such thing as an undecidable statement. A single statement can't be undecidable. Undecidability is a property of a <i>class</i> of statements.<p>For example, you can ask whether a Java program, run with infinite memory, will eventually halt. For any <i>particular</i> Java program, there's obviously an algorithm that says whether it halts or not. The algorithm is a single statement, which says either "yes" or "no". Might be hard to figure out which is the correct algorithm, but the Java program is fixed so the algorithm is definitely one of the two.<p>However, there is no algorithm which can take an <i>arbitrary</i> Java program as input and determine whether it will halt. It's about the class of all possible programs.</p>
]]></description><pubDate>Sat, 11 Jul 2026 00:41:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=48867238</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=48867238</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48867238</guid></item><item><title><![CDATA[New comment by justinpombrio in "A software engineering interview question I like: computing the median"]]></title><description><![CDATA[
<p>> That's average or mean. Median is the middle value.<p>The median of an even number of values is typically defined to be the mean of the two middle-most values.</p>
]]></description><pubDate>Thu, 09 Jul 2026 02:24:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48840212</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=48840212</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48840212</guid></item><item><title><![CDATA[New comment by justinpombrio in "Defeating Git Rigour Fatigue with Jujutsu"]]></title><description><![CDATA[
<p>> it might be a week before i get back to it, and the name of the branch is a clue as to what the heck I was doing.<p>Ah, this is what the description (what git would call the commit message) is for. You can set the description even before you've made any changes.</p>
]]></description><pubDate>Mon, 25 May 2026 01:12:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=48262589</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=48262589</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48262589</guid></item><item><title><![CDATA[New comment by justinpombrio in "Shunting-Yard Animation"]]></title><description><![CDATA[
<p>Parsing is usually implemented in two steps: first there's <i>lexing</i> where the input is turned into a sequence of tokens, then there's proper <i>parsing</i> where the sequence of tokens is turned into an abstract syntax tree. This shunting yard algorithm is part of parsing. Lexing happens before that.<p>For example, this input:<p><pre><code>    13- 2  *5 + 4
</code></pre>
would be lexed into this sequence of tokens:<p><pre><code>    "13" "-" "2" "*" "5" "+" "4"
</code></pre>
You could use the shunting yard algorithm to put these in a convenient postfix order:<p><pre><code>    "13" "2" "5" "*" "-" "4" "+"
</code></pre>
It's really easy to then turn it into an abstract syntax tree (AST). Go through each token in order: if it's a number you make it into a node and push it onto a stack; if it's a binary operator you pop two nodes off the stack and make a node out of those and the binary operator. If you write down this AST as an s-expression you get:<p><pre><code>    (+ (- 13 (* 2 5)) 4)</code></pre></p>
]]></description><pubDate>Sun, 10 May 2026 21:21:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=48088195</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=48088195</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48088195</guid></item><item><title><![CDATA[New comment by justinpombrio in "Shunting-Yard Animation"]]></title><description><![CDATA[
<p>Yeah, it's a parsing algorithm for parsing infix (etc.) expressions. If you've seen a parsing library refer to "precedence climbing" or "operator precedence parsing", it's doing this (or something very similar).<p>If you want to enter the number `13`, that should be one token, but there's no way to make a `13` token in this UI. You need to stick to single digits for this site to work correctly.</p>
]]></description><pubDate>Sun, 10 May 2026 17:33:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48085970</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=48085970</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48085970</guid></item><item><title><![CDATA[New comment by justinpombrio in "Shunting-Yard Animation"]]></title><description><![CDATA[
<p>It treated that as<p><pre><code>    1 0 0 + 8 8 / 4
</code></pre>
which is nonsensical, but it has no error detection so it rolled with it. Really `100` should be its own token, but there's no way to input that.</p>
]]></description><pubDate>Sun, 10 May 2026 17:29:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=48085933</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=48085933</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48085933</guid></item><item><title><![CDATA[New comment by justinpombrio in "Microsoft is employing dark patterns to goad users into paying for storage?"]]></title><description><![CDATA[
<p>Honestly I've had more technical problems installing Windows than Linux Mint recently, not to mention the multiple hours spent hunting down and disabling all of the telemetry and ads in Windows. Still can't believe they put ads in File Explorer.</p>
]]></description><pubDate>Fri, 10 Apr 2026 04:59:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=47713816</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=47713816</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47713816</guid></item><item><title><![CDATA[New comment by justinpombrio in "71% Desk Workers Say Screen-Related Visual Discomfort Is Reducing Productivity"]]></title><description><![CDATA[
<p>This is a terrible source of information: it's talking about a survey about vision problems, by an eye care company, and you can't see the survey.<p>I'm completely sure that the way they worded the question the headline is about was very generously worded and that the phrasing in the headline misrepresents what it asked, because that's how these things work. Not that anyone is at <i>fault</i>, of course, the headline isn't a <i>lie</i>, and of course there are <i>other reasons</i> that the survey is hidden behind a subscription wall. It just <i>so happens</i> that the percent of people with screen-related visual discomfort according to the eye-care company survey is, I dunno, 2x higher than it would be if you asked the question directly. That's just how these things work.<p>(I suspect that someone is going to confuse this comment as me saying that eye-strain from screens isn't a problem for a lot of people. Pre-empting that by agreeing that, yes, of course eye-strain from screen is a problem for a lot of people.)</p>
]]></description><pubDate>Sun, 08 Mar 2026 21:05:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=47301454</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=47301454</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47301454</guid></item><item><title><![CDATA[New comment by justinpombrio in "Memory access is O(N^[1/3])"]]></title><description><![CDATA[
<p>Could you name one that seems likely to fail?</p>
]]></description><pubDate>Wed, 08 Oct 2025 22:08:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=45521153</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=45521153</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45521153</guid></item><item><title><![CDATA[New comment by justinpombrio in "Why haven't local-first apps become popular?"]]></title><description><![CDATA[
<p>I was going to say that that's not a CRDT because it <i>requires</i> a centralized server (the conflict resolution is "order in which the server received the messages", and clients aren't allowed to share updates with each other, they can only get updates from the server). But now I'm looking at definitions of CRDTs and it's not clear to me whether this is supposed to count or not.<p>Still, every algorithm that's actually labeled a CRDT shares a magical property: if my replica has some changes, and your replica has some changes, our replicas can share their changes with each other and each converge closer to the final state of the document, <i>even if other people have been editing at the same time, and different subsets of their changes have been shared with you or I</i>. That is, you can apply peoples' changes in any order and still get the same result. I don't think it's useful to call anything without that property a CRDT.</p>
]]></description><pubDate>Tue, 23 Sep 2025 01:35:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=45341848</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=45341848</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45341848</guid></item><item><title><![CDATA[New comment by justinpombrio in "The Expression Problem and its solutions (2016)"]]></title><description><![CDATA[
<p>Rust's traits _do_ solve the expression problem.<p>Each data type is a `struct`. Each operation is a trait. You `impl` each trait on each struct.<p>This works even if you're using a library that has declared `struct A` and `struct B` and `trait F` and `trait G`, and you want to add both a `struct C` and a `trait H`, and fill out the whole 3x3 grid without modifying the library.<p>The library says:<p><pre><code>    struct A { ... }
    struct B { ... }

    trait F { ... }
    impl F for A { ... }
    impl F for B { ... }

    trait G { ... }
    impl G for A { ... }
    impl G for B { ... }

    fn some_function<T: F + G>(data: T) { ... }
</code></pre>
Your code says:<p><pre><code>    use library::{A, B, F, G};

    struct C { ... }
    impl F for C { ... }
    impl G for C { ... }

    trait H { ... }
    impl H for A { ... }
    impl H for B { ... }
    impl H for C { ... }

    fn another_function<T: F + G + H>(data: T);
</code></pre>
Now `library::some_function()` can be called with an A, B, or C, even though C was defined by the user of the library. And `another_function()` can be called with A, B, or C, even though A was defined by the library.</p>
]]></description><pubDate>Sun, 07 Sep 2025 18:22:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=45160823</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=45160823</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45160823</guid></item><item><title><![CDATA[New comment by justinpombrio in "Show HN: I made a tool to port tweets to Bluesky mantaining their original date"]]></title><description><![CDATA[
<p>> (not an actual dictionary) Urban Dictionary<p><troll>
The definition of dictionary is just "Words about words" (source: Urban Dictionary), so I'd say that Urban Dictionary qualifies.
</troll></p>
]]></description><pubDate>Wed, 19 Mar 2025 05:06:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=43408421</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43408421</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43408421</guid></item><item><title><![CDATA[New comment by justinpombrio in "What can be computed? A practical guide to the theory of computation (2018) [pdf]"]]></title><description><![CDATA[
<p>> by assuming that a system that can be formally modeled can prove something that cannot be proven within a formal system<p>Something that cannot be proven within <i>which</i> formal system? Every true statement can be proven by <i>some</i> formal system. No formal system can prove <i>all</i> true statements.<p>(This is all about Godel incompleteness. Turing incomputability does apply though, see the sibling comments! It's important to keep them separate, they're saying different things.)</p>
]]></description><pubDate>Fri, 28 Feb 2025 17:03:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=43207839</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43207839</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43207839</guid></item><item><title><![CDATA[New comment by justinpombrio in "What can be computed? A practical guide to the theory of computation (2018) [pdf]"]]></title><description><![CDATA[
<p>Oof, I pattern matched OP to a different argument I've seen a lot. That's embarrassing.<p>Yes, that's correct, it's provably impossible to construct an LLM that, if you ask it "Will this program halt? <program>", answers correctly for all programs. Likewise humans, under the assumption that you can accurately simulate physics with a computer. (Note that QM isn't an obstacle, as you can emulate QM just fine with a classical computer with a mere exponential slowdown.)</p>
]]></description><pubDate>Fri, 28 Feb 2025 16:57:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=43207781</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43207781</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43207781</guid></item><item><title><![CDATA[New comment by justinpombrio in "What can be computed? A practical guide to the theory of computation (2018) [pdf]"]]></title><description><![CDATA[
<p>Gödel's Incompleteness Theorem places a limit on what you can prove <i>within a formal system</i>. Neither humans nor LLMs are a formal system, so it says nothing about them.<p>Someone's going to think that, since you can formally model computer programs (and thus formally model how an LLMs runs), that means that Gödel's Incompleteness Theorem applies to computer programs and to LLMs. But that's irrelevant; being model-able doesn't make something a formal system!<p>"Formal system" has a very technical meaning: it has a set of consistent axioms, and the ability to enumerate formal proofs using those axioms. For example, Zermelo-Fraenkel set theory is a formal system [1]. It has nine formal axioms, which you can see listed in its Wikipedia article. Utterly different kind of thing than humans or LLMs. Comparing an LLM to ZFC is like comparing a particular watermelon to the number 4.<p>[1] <a href="https://en.wikipedia.org/wiki/Zermelo%E2%80%93Fraenkel_set_theory#Axioms" rel="nofollow">https://en.wikipedia.org/wiki/Zermelo%E2%80%93Fraenkel_set_t...</a></p>
]]></description><pubDate>Fri, 28 Feb 2025 04:46:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=43201797</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43201797</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43201797</guid></item><item><title><![CDATA[New comment by justinpombrio in "Is this the simplest (and most surprising) sorting algorithm ever? (2021)"]]></title><description><![CDATA[
<p>Can you give a reference to your teaching materials? The way this sort works is bizarre enough that I'm curious what you said about it. (Also to verify that this is actually the algorithm you taught, given how many other people thought it was something else.)</p>
]]></description><pubDate>Tue, 25 Feb 2025 02:02:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=43167226</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43167226</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43167226</guid></item><item><title><![CDATA[New comment by justinpombrio in "Is this the simplest (and most surprising) sorting algorithm ever? (2021)"]]></title><description><![CDATA[
<p>Yeah, 2410 vs. 2509 swaps not including the first iteration. You should try measuring these things yourself, I'm not sure if it's doing what you think it's doing.</p>
]]></description><pubDate>Tue, 25 Feb 2025 00:56:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=43166817</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43166817</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43166817</guid></item><item><title><![CDATA[New comment by justinpombrio in "Is this the simplest (and most surprising) sorting algorithm ever? (2021)"]]></title><description><![CDATA[
<p>> Why is there any difference? Does the entire difference come from the iteration where i = 1?<p>Sometimes it's more swaps, and sometimes it's less. The vague pattern looks like Can't Believe Sort does slightly fewer swaps on larger lists, but that could also have been noise.<p>Why do you expect them to have exactly the same number of swaps?<p>> Bubble sort can do less than this.<p>Oh sorry yeah, I implemented bubble sort without any sort of early return, for a more direct comparison.</p>
]]></description><pubDate>Mon, 24 Feb 2025 22:40:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=43165797</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43165797</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43165797</guid></item><item><title><![CDATA[New comment by justinpombrio in "Is this the simplest (and most surprising) sorting algorithm ever? (2021)"]]></title><description><![CDATA[
<p>The number of swaps is nearly the same between Bubble Sort and Can't Believe Sort. For a random list with 100 elements, it's 2505 swaps vs. 2513 swaps.<p>The number of comparisons is of course about twice as large, because Bubble Sort always does exactly n(n-1)/2 comparisons while Can't Believe sort always does exactly n*n comparisons.<p><a href="https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=c72e58050b15bf76da23144685caefe4" rel="nofollow">https://play.rust-lang.org/?version=stable&mode=debug&editio...</a></p>
]]></description><pubDate>Mon, 24 Feb 2025 22:13:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=43165557</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43165557</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43165557</guid></item><item><title><![CDATA[New comment by justinpombrio in "Is this the simplest (and most surprising) sorting algorithm ever? (2021)"]]></title><description><![CDATA[
<p>I did search for "trivial sorting network", but the only networks that were called trivial were the ones for exactly two elements, while this algorithm sorts an arbitrary number of elements.<p>Could you link to what you're talking about? And what's its big-O runtime?</p>
]]></description><pubDate>Mon, 24 Feb 2025 18:15:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=43162858</link><dc:creator>justinpombrio</dc:creator><comments>https://news.ycombinator.com/item?id=43162858</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43162858</guid></item></channel></rss>