<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: noelwelsh</title><link>https://news.ycombinator.com/user?id=noelwelsh</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 20 Aug 2026 03:15:13 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=noelwelsh" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by noelwelsh in "Scientists stunned by children's lung recovery in ultra low emission zone"]]></title><description><![CDATA[
<p>Pointless anti-intellectualism.<p>There is a big difference between believing something is true, and demonstrating it is true and measuring the effect. One is a vibe. The other can drive policy.</p>
]]></description><pubDate>Wed, 19 Aug 2026 07:29:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=49358167</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49358167</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49358167</guid></item><item><title><![CDATA[New comment by noelwelsh in "Children's stunted lungs show recovery in ultra low emission zone"]]></title><description><![CDATA[
<p>Pointless anti-intellectualism.<p>There is a big difference between believing something is true, and demonstrating it is true and measuring the effect. One is a vibe. The other can drive policy.</p>
]]></description><pubDate>Wed, 19 Aug 2026 07:28:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=49358152</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49358152</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49358152</guid></item><item><title><![CDATA[When the Hard Part Stops Being Hard]]></title><description><![CDATA[
<p>Article URL: <a href="https://proofsandintuitions.net/2026/08/14/when-the-hard-part-stops-being-hard/">https://proofsandintuitions.net/2026/08/14/when-the-hard-part-stops-being-hard/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49299705">https://news.ycombinator.com/item?id=49299705</a></p>
<p>Points: 6</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 14 Aug 2026 15:05:15 +0000</pubDate><link>https://proofsandintuitions.net/2026/08/14/when-the-hard-part-stops-being-hard/</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49299705</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49299705</guid></item><item><title><![CDATA[New comment by noelwelsh in "JDK 27 G1/Parallel/Serial GC Changes"]]></title><description><![CDATA[
<p>>  Is java able to stackify most new Object calls and elide default initialization of object members these days?<p>Escape analysis in OpenJDK will stack allocate values where it can show it is safe to do so. Project Valhalla is also reducing the memory footprint of objects.<p>As for thread safety, that is more of a language concern than a runtime one. Amongst JVM languages Scala is leading here AFAIK. Its "capture checking"[1] provides thread safety (e.g. [2]) and actually covers escape analysis as well. On Scala Native (the native code backend for Scala) capture checking can be used for safe stack allocation and safe arena allocation.<p>[1]: <a href="https://docs.scala-lang.org/scala3/reference/experimental/cc.html" rel="nofollow">https://docs.scala-lang.org/scala3/reference/experimental/cc...</a>
[2]: <a href="https://softwaremill.com/understanding-capture-checking-in-scala/" rel="nofollow">https://softwaremill.com/understanding-capture-checking-in-s...</a></p>
]]></description><pubDate>Fri, 14 Aug 2026 10:32:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=49296879</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49296879</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49296879</guid></item><item><title><![CDATA[New comment by noelwelsh in "Why Books Don't Work: Constructivism over Transmissionism (2021)"]]></title><description><![CDATA[
<p>I would have thought it's obvious to anyone who has studied any subject in depth that you need to actively engage with the material. Books are great because they go at the pace that suits your learning and are easy to skip around. Video not so much.<p>The proposed replacements seem to be technology that takes some of the active role away from the student. That doesn't seem to me that it would be effective, as anything I've learned well has required I do that kind of active introspection. Off-loading it to a machine feels like it would harm my learning.<p>Also, very typical of software people to reach for software solutions. There is a much wider space that can be explored. Maybe that would be more fruitful?</p>
]]></description><pubDate>Fri, 14 Aug 2026 08:02:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=49295865</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49295865</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49295865</guid></item><item><title><![CDATA[New comment by noelwelsh in "Tail-call optimization in C is relatively recent (2025)"]]></title><description><![CDATA[
<p>Switch is fine if you don't care about performance. If you do care about performance then direct threading is faster. Direct threading uses tail calls.<p>More here: <a href="https://noelwelsh.com/posts/understanding-vm-dispatch/" rel="nofollow">https://noelwelsh.com/posts/understanding-vm-dispatch/</a></p>
]]></description><pubDate>Wed, 12 Aug 2026 15:26:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=49273912</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49273912</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49273912</guid></item><item><title><![CDATA[New comment by noelwelsh in "LinkedIn CringeBot 3000"]]></title><description><![CDATA[
<p>When Twitter imploded I expected technical discussions to migrate to Mastodon or Bluesky. What happened next shocked me.<p>Technical content appeared on LinkedIn.<p>Not just one or two posts. Tens of posts. Every day. Technical content from the thought leaders in the industry.<p>Yes, there was still corporate slop.<p>Yes, LinkedIn still mostly serves for self-aggrandisement.<p>But there were nuggets of gold, for those prepared to sift for them.<p>Seriously: LinkedIn is still mostly garbage. The quality of discussion is not great. But it has improved a bit, and given the fractured nature of social media at the moment it's somewhat viable to use it for technical content. It very much depends on the specific area. If you want to talk about the new hotness (e.g. using LLMs to write software) there is a lot. For more niche areas I expect other venues will do better.</p>
]]></description><pubDate>Wed, 12 Aug 2026 09:28:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=49269775</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49269775</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49269775</guid></item><item><title><![CDATA[New comment by noelwelsh in "England set to be one of the first countries to eliminate hepatitis C"]]></title><description><![CDATA[
<p>You seem to think there is some kind of conspiracy at play. The BBC is simply using the terminology used by the professionals who deal with this.</p>
]]></description><pubDate>Tue, 11 Aug 2026 14:17:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=49258805</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49258805</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49258805</guid></item><item><title><![CDATA[New comment by noelwelsh in "Tail-call optimization in C is relatively recent (2025)"]]></title><description><![CDATA[
<p>> What practical patterns are enabled by TCO in C?<p>It's important in interpreters. Here's an example: <a href="https://blog.reverberate.org/2021/04/21/musttail-efficient-interpreters.html" rel="nofollow">https://blog.reverberate.org/2021/04/21/musttail-efficient-i...</a></p>
]]></description><pubDate>Mon, 10 Aug 2026 19:11:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=49248287</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49248287</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49248287</guid></item><item><title><![CDATA[New comment by noelwelsh in "Tail-Call Interpreters in Rust – Jimmy Ostler"]]></title><description><![CDATA[
<p>Sorry, I wasn't clear. In OP's blog post they refer to me as Neal at one point (just after the heading "Indirect Dispatch"). My name is still Noel :-)</p>
]]></description><pubDate>Mon, 10 Aug 2026 14:39:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=49244324</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49244324</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49244324</guid></item><item><title><![CDATA[New comment by noelwelsh in "Tail-Call Interpreters in Rust – Jimmy Ostler"]]></title><description><![CDATA[
<p>It's a transform on the instruction set. If you have the following instruction set  for a tree walking interpreter (Scala syntax)<p><pre><code>  enum Expr:
    case Add(left: Expr, right: Expr)
    case Lit(val: Double)
</code></pre>
the corresponding stack machine instruction set is<p><pre><code>  enum Expr:
    case Add
    case Lit(val: Double)
</code></pre>
The transformation in this direction is purely syntactic: where you see that a case has a parameter of type Expr in the instruction set, you simply remove that parameter for the corresponding stack machine instruction.<p>The transformation in the other direction is not purely syntactic as you have to know that, e.g., Add gets two parameters from the stack and add those parameters back in.</p>
]]></description><pubDate>Mon, 10 Aug 2026 14:37:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=49244298</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49244298</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49244298</guid></item><item><title><![CDATA[New comment by noelwelsh in "Tail-Call Interpreters in Rust – Jimmy Ostler"]]></title><description><![CDATA[
<p>Thanks for pointing those out. I've fixed both issues.<p>Syntax highlighting was a discrepancy between my local env and the Netlify env that deploys the site.<p>`loop` is what I usually call tail-recursive loops in my personal style. I think I changed that to `dispatch` for the blog post and didn't push the change all the way through.</p>
]]></description><pubDate>Mon, 10 Aug 2026 14:31:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=49244227</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49244227</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49244227</guid></item><item><title><![CDATA[New comment by noelwelsh in "Tail-Call Interpreters in Rust – Jimmy Ostler"]]></title><description><![CDATA[
<p>I should have said instruction set or intermediate representation (IR). For a stack machine a program is an array of instructions. For a tree-walking interpreter a program is a tree of instructions. The duality transforms one instruction set into the other.<p>Hope that clears it up.</p>
]]></description><pubDate>Mon, 10 Aug 2026 14:25:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=49244147</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49244147</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49244147</guid></item><item><title><![CDATA[New comment by noelwelsh in "Tail-Call Interpreters in Rust – Jimmy Ostler"]]></title><description><![CDATA[
<p>Made my day that it references an article I wrote! :-D<p>Another thing that is kinda neat: there is a duality (a bidirectional transform) between the AST for a tree walking interpreter and the AST for a stack machine. To create the stack machine AST, all you do is remove any occurrence of the expression type in the tree-walking AST; these values are now found on the stack. Obvious when you think about it, but useful nonetheless. I don't think there is a simple equivalent for a register machine as, unless you have an infinite number of registers, you need to do register allocation.<p>(If the author reads this, my name changed from Noel to Neal at some point. I don't really mind though; my name is a bit unusual and I've been called all sorts of things.)</p>
]]></description><pubDate>Mon, 10 Aug 2026 12:00:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=49242532</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49242532</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49242532</guid></item><item><title><![CDATA[New comment by noelwelsh in "Guarded Methods in OCaml (2025)"]]></title><description><![CDATA[
<p>The general term for this is an indexed type. Specifically what is shown here is indexed codata. Indexed data is more commonly known as generalized algebraic data types (GADTs), which encode equality constraints at construction.<p>GADTs are well established in FP, but codata in general is not[^1]. As far as I can tell this is partly historical and partly cultural. (Codata is basically OO. Recent FP languages, like Idris, have explicit support for codata.)<p>More in my book: <a href="https://functionalprogrammingstrategies.com/" rel="nofollow">https://functionalprogrammingstrategies.com/</a><p>^[1]: The degenerate form of codata is the function, which FP languages do tend to support very well.</p>
]]></description><pubDate>Sat, 08 Aug 2026 09:30:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=49220173</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49220173</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49220173</guid></item><item><title><![CDATA[New comment by noelwelsh in "Note-Taking and Personal Knowledge Management"]]></title><description><![CDATA[
<p>Writing the notes is more the point than re-reading them, at least for me. Writing stuff down forces me to kick things around and find a good structure, and that's where the useful stuff happens.</p>
]]></description><pubDate>Sun, 02 Aug 2026 20:47:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=49148147</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49148147</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49148147</guid></item><item><title><![CDATA[New comment by noelwelsh in "Hunter-gatherers introduced fish to a mountain lake 7000 years ago"]]></title><description><![CDATA[
<p>A few comments on the previous abundance of cod, from <a href="https://www.sciencehistory.org/stories/magazine/a-tragedy-with-no-end/" rel="nofollow">https://www.sciencehistory.org/stories/magazine/a-tragedy-wi...</a><p>In 1873, French novelist Alexandre Dumas wrote that if every egg reached maturity, within three years “you could walk across the Atlantic dryshod on the backs of cod.” In 1885, the Canadian Ministry of Agriculture said it was not only impossible to exhaust the cod supply, but even to make a noticeable dent in it. “Unless the order of nature is overthrown, for centuries to come our fisheries will continue to be fertile,” the ministry declared.<p>Humans find a way:
<a href="https://en.wikipedia.org/wiki/Collapse_of_the_Atlantic_northwest_cod_fishery" rel="nofollow">https://en.wikipedia.org/wiki/Collapse_of_the_Atlantic_north...</a></p>
]]></description><pubDate>Wed, 29 Jul 2026 18:53:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=49101499</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49101499</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49101499</guid></item><item><title><![CDATA[New comment by noelwelsh in "Show HN: Scala Tutorials – interactive Scala 3 lessons in the browser"]]></title><description><![CDATA[
<p>Very nice!</p>
]]></description><pubDate>Tue, 28 Jul 2026 13:19:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=49083421</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49083421</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49083421</guid></item><item><title><![CDATA[New comment by noelwelsh in "Memory safety absolutists"]]></title><description><![CDATA[
<p>Scala's capture checking [1] is a modal type system.<p>[1]: <a href="https://docs.scala-lang.org/scala3/reference/experimental/cc.html" rel="nofollow">https://docs.scala-lang.org/scala3/reference/experimental/cc...</a></p>
]]></description><pubDate>Tue, 28 Jul 2026 09:01:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=49081220</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49081220</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49081220</guid></item><item><title><![CDATA[New comment by noelwelsh in "[dead]"]]></title><description><![CDATA[
<p>Good article. We really need more nuance in the discussion of using LLMs for SE. Not all tasks are the same; we shouldn't expect to use the same process across them!<p>In my experience, the more constrained the LLM is, either by existing patterns in the code base or by prior art in general, the better the LLM is. When I've asked it do architectural or design work, it has been much less successful. That's one dimension on which LLM capabilities vary. There are certainly more!</p>
]]></description><pubDate>Tue, 28 Jul 2026 08:38:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=49081078</link><dc:creator>noelwelsh</dc:creator><comments>https://news.ycombinator.com/item?id=49081078</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49081078</guid></item></channel></rss>