<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: Twey</title><link>https://news.ycombinator.com/user?id=Twey</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 13 Jun 2026 14:06:05 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=Twey" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by Twey in "Who Runs Your Rust Future? Hands-On Intro to Async Rust"]]></title><description><![CDATA[
<p>Yes I really think it should be better advertised!<p>The continuation model is the standard model of async programming and still perhaps the nicest semantically.  Rust's big innovation is that futures are polled from the top, i.e. (potentially) advanced in an idempotent way whenever any of their relevant resources progresses, which is nicer for resource-conscious programming because it doesn't require that you capture the stack. It adds complexity over the continuation model from the programmer's point of view, but opens up async programming to a wider range of contexts in a way that is genuinely novel.</p>
]]></description><pubDate>Thu, 11 Jun 2026 13:34:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=48490153</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48490153</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48490153</guid></item><item><title><![CDATA[New comment by Twey in "Who Runs Your Rust Future? Hands-On Intro to Async Rust"]]></title><description><![CDATA[
<p>> What is harder to find is the bridge between them, the part that connects understanding how async works to actually shipping with it.<p>There is actually already a tutorial at this level: Tokio has its ‘async in depth’ tutorial [1] that walks you through building a toy runtime and using it to run a future.<p>Not a complaint — you can never have too many tutorials, unless they're about monads — but just a pointer in case you hadn't seen it :)<p>[1]: <a href="https://tokio.rs/tokio/tutorial/async" rel="nofollow">https://tokio.rs/tokio/tutorial/async</a></p>
]]></description><pubDate>Wed, 10 Jun 2026 14:55:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=48477298</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48477298</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48477298</guid></item><item><title><![CDATA[New comment by Twey in "Splash Is a Colour Format"]]></title><description><![CDATA[
<p>> I like my colours to have a bit more blue and green in them, so I skewed everything that direction. Colours like 222 look a tiny bit bluer / greener than you'd expect. It might be hard to see but trust me, it's true babe</p>
]]></description><pubDate>Mon, 08 Jun 2026 09:08:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=48442949</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48442949</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48442949</guid></item><item><title><![CDATA[New comment by Twey in "DNS is for people, not for IT infrastructure"]]></title><description><![CDATA[
<p>John Day talks about this a fair bit: what people want to do is naming of applications, in a way that makes it independent of addressing (i.e. where the application is running). DNS still names the machine — it's just a one-step abstracted machine addressing scheme, not an application naming scheme per se. Then we designed an ad-hoc protocol on top that associates applications with specific machine names (and port numbers): if you go to facebook.com:443 (a.k.a. https) you expect to find an instance of the Facebook application, not a webmail client or an SSH server.<p>This isn't how any of this was really supposed to work. Back in the day the application identifier was the _port number_, according to a big list maintained by ICANN. The idea was that you could go to a machine (identified by IP or more conveniently by DNS) and see if it was running an instance of the ‘Facebook’ application, i.e. you'd find Facebook not at facebook.com:https but at meta.com:facebook. The end goal was to eliminate the need for the former part at some point, and come up with a better way of looking up applications than distributing a list by email. Instead the application ID is now used for transport and the host name instead encodes application ID, which it was never meant for, and that's why we can't have nice things (like device mobility).</p>
]]></description><pubDate>Fri, 05 Jun 2026 00:58:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48406733</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48406733</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48406733</guid></item><item><title><![CDATA[New comment by Twey in "Show HN: Lint Your Markdown with ESLint"]]></title><description><![CDATA[
<p>The concept of linting feels somehow inimical to Markdown, a language designed to progressively enhance existing plain-text formatting conventions.</p>
]]></description><pubDate>Thu, 04 Jun 2026 12:18:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48397604</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48397604</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48397604</guid></item><item><title><![CDATA[New comment by Twey in "Three Years of Abstractionless C"]]></title><description><![CDATA[
<p>But my bitstring representation of a heap may not be your bitstring representation of the same heap. Neither C nor C++ makes enough guarantees about the representation of the heap that you can assume that, so a higher-level ‘heap’ type that abstracts over the respective representations of my heap and your heap is inevitable, and not something to be scared of. Of course you can reasonably ask for a language in which the representation of a heap is uniform across hardware, but it will come with some performance penalties.<p>Everything on the computer can be _represented as_ a bit string. But it's important not to confuse that fact with everything on the computer _being_ a bit string. The bit string is only a ‘name’ to represent the thing in conversation between people who share an understanding of what that representation should represent.</p>
]]></description><pubDate>Mon, 25 May 2026 23:26:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=48273064</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48273064</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48273064</guid></item><item><title><![CDATA[New comment by Twey in "Three Years of Abstractionless C"]]></title><description><![CDATA[
<p>> On the higher philosophical level, I wanted to avoid the cursed tower-of-abstractions trap that I felt quite sharply in C++.<p>Then you might want to avoid computers in general: C also sits on a tower of ‘imaginary’ abstractions (binary, gates, functions, allocation, virtual memory…). The computer itself is an abstraction, and sits on top of a teetering tower of other abstractions like electronics, physics, and (if you want to get philosophical about it) discrete objects.<p>> same bytes packaged differently become entirely different incompatible entities (like std::string vs std::vector<char> vs std::valarray<> etc)<p>The same bytes simply _are_ (in)compatible with different things depending on semantic context, and C++ is just surfacing that to you. A given slice of linear memory (which is an abstraction, of course) could be representing a heap or a string with the same bytes, and you'd better know which when using them — that information is not stored in the bytes themselves. Your choice is either to represent this in a way that the compiler can check for you, or encode that information in freeform human documentation about how to avoid the error cases that the compiler can no longer help you with.</p>
]]></description><pubDate>Mon, 25 May 2026 11:45:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=48265741</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48265741</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48265741</guid></item><item><title><![CDATA[New comment by Twey in "Making your own programming language is easier than you think (but also harder)"]]></title><description><![CDATA[
<p>In the same vein Wasm is also an option that might be more suited to this kind of thing thanks to the higher-level ABI (/components).</p>
]]></description><pubDate>Sun, 10 May 2026 14:24:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=48084233</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48084233</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48084233</guid></item><item><title><![CDATA[New comment by Twey in "Making your own programming language is easier than you think (but also harder)"]]></title><description><![CDATA[
<p>Even the _design_ of languages is a generational project. There are open problems in the PL space that we know need to be fixed but we have no idea how. Once you've got the ‘core ideas’ of the language in some papers somewhere (and proofs that they're coherent, which is usually the meat of the process) it's a pretty quick step to get a toy implementation, but then the path to an implementation that is usable for day-to-day work (especially if performance is important) can take decades, and the path to adoption after that can easily take between 5 and 20 more years.<p>Then people figure out the thing about your core ideas that gets in the way when writing the kinds of real-world programs they want to write and you get to go back to the drawing board for the next language idea :)<p>As an example of the kind of time scales involved, linear logic was introduced in 1987. Linear (well, affine) types made it into Rust 1.0 in 2015, which IMO is the first time substructural types have made it to a ‘mainstream’ (albeit still far from ubiquitous) language. And that's a very straightforward language feature that doesn't really challenge the dominant imperative/functional hybrid paradigm or have any inherent effect on performance (since it's ‘just’ a type system feature).<p>IMHO the next big thing up (assuming LLMs and other AI advancements don't throw everything off-kilter) is probably effect systems, introduced in ~2013, for which we can linearly extrapolate a time frame of about 2041!<p>But maybe not — one exciting thing that's been happening is that (as Jonathan Blow noted) with the growth of lower-level substrates like LLVM the work to go from a toy to a working and performant language has decreased significantly.</p>
]]></description><pubDate>Sun, 10 May 2026 14:20:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=48084209</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48084209</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48084209</guid></item><item><title><![CDATA[New comment by Twey in "Bun's experimental Rust rewrite hits 99.8% test compatibility on Linux x64 glibc"]]></title><description><![CDATA[
<p>Were there perhaps [licensing issues](<a href="https://www.phoronix.com/news/Chardet-LLM-Rewrite-Relicense" rel="nofollow">https://www.phoronix.com/news/Chardet-LLM-Rewrite-Relicense</a>) with the original?</p>
]]></description><pubDate>Sat, 09 May 2026 22:58:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=48079092</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48079092</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48079092</guid></item><item><title><![CDATA[New comment by Twey in "Specsmaxxing – On overcoming AI psychosis, and why I write specs in YAML"]]></title><description><![CDATA[
<p>Sure, I'm not suggesting we need to go into infinite regress for every explanation! I'm saying that you should bear in mind that you _are_ in the middle of an infinite stack, and what is a ‘how’, a ‘what’ or a ‘why’ is just a function of your current position in it relative to the thing you're talking about. In the ID generation code you might want to explain why you're using this weird format here instead of a more standard format (because it needs to be passed to legacy system XYZ). But if you go up a step or two to where the ID is passed to XYZ in code, that ‘why’ has become a ‘what’ — the calling code acts as a ‘specification’ for the behaviour of that ID generation code.</p>
]]></description><pubDate>Tue, 05 May 2026 12:27:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=48021556</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48021556</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48021556</guid></item><item><title><![CDATA[New comment by Twey in "Specsmaxxing – On overcoming AI psychosis, and why I write specs in YAML"]]></title><description><![CDATA[
<p>As any four-year-old can tell you, ‘why’ is infinitely recursive. ‘What’ from the perspective of level n is ‘how’ looking down from level n+1 and ‘why’ looking up from level n-k.</p>
]]></description><pubDate>Mon, 04 May 2026 14:08:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48008997</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48008997</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48008997</guid></item><item><title><![CDATA[New comment by Twey in "Specsmaxxing – On overcoming AI psychosis, and why I write specs in YAML"]]></title><description><![CDATA[
<p>As far as I understand it I'm on your side in this argument — I think ‘code’ continues to matter so long as the LLM-to-execution pipeline remains a leaky abstraction — but I don't think the analogy is correct. The ads are the resultant behaviour of the software, e.g. the UX, not the code.</p>
]]></description><pubDate>Mon, 04 May 2026 00:30:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=48003155</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48003155</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48003155</guid></item><item><title><![CDATA[New comment by Twey in "Specsmaxxing – On overcoming AI psychosis, and why I write specs in YAML"]]></title><description><![CDATA[
<p>And given a C description of a program, a C runtime can implement that program in various different ways — interpreted vs compiled, explicit memory management vs garbage collection, different pointer sizes and memory layouts, parallelism at various points or not. It's turtles all the way down :) It just becomes ‘code’ at the point where a computer can execute it (in one way or another) without further human intervention.</p>
]]></description><pubDate>Mon, 04 May 2026 00:20:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=48003087</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48003087</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48003087</guid></item><item><title><![CDATA[New comment by Twey in "Specsmaxxing – On overcoming AI psychosis, and why I write specs in YAML"]]></title><description><![CDATA[
<p>Specs also evolve over time. There's no ‘end goal’ because requirements are always changing.<p>Specs are traditionally more forward-looking only because, by removing a lot of the implementation details that are required to write code, the specification can be written to be much broader in scope than code in an equivalent time period. But periodically we invent software that lets us automatically fill in more details of the software that now don't need to be specified by humans, and a level of specification that was previously ‘spec’ turns into ‘code’.</p>
]]></description><pubDate>Mon, 04 May 2026 00:16:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=48003064</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=48003064</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48003064</guid></item><item><title><![CDATA[New comment by Twey in "Specsmaxxing – On overcoming AI psychosis, and why I write specs in YAML"]]></title><description><![CDATA[
<p>The traditional name for this spec is ‘source code’ — a canonical source of truth for the behaviour of a system that is as human-readable as we know how to make it, that will be processed by automated tools into a less-readable derived artefact for a computer to execute.<p>Checking the compiled artefact into the codebase without checking in its source code has always been a risky move!</p>
]]></description><pubDate>Sun, 03 May 2026 10:58:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47995674</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=47995674</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47995674</guid></item><item><title><![CDATA[New comment by Twey in "“Why not just use Lean?”"]]></title><description><![CDATA[
<p>Intuitionistic logic is a refinement of classical logic, not a limitation: for every proposition you can prove in classical logic there is at least one equivalent proposition in intuitionistic logic. But when your use of LEM is tracked by the logic (in intuitionistic logic a proof by LEM can only prove ¬¬A, not A, which are not equivalent) it's a constant temptation to try to produce a constructive proof that lets you erase the sin marker.<p>In compsci that's actually sometimes relevant, because the programs you can extract from a ¬¬A are not the same programs you can extract from an A.</p>
]]></description><pubDate>Mon, 27 Apr 2026 19:16:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=47925978</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=47925978</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47925978</guid></item><item><title><![CDATA[New comment by Twey in "Meta tells staff it will cut 10% of jobs"]]></title><description><![CDATA[
<p>And WhatsApp and Instagram were acquisitions, not creations.</p>
]]></description><pubDate>Fri, 24 Apr 2026 12:10:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47889136</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=47889136</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47889136</guid></item><item><title><![CDATA[New comment by Twey in "All elementary functions from a single binary operator"]]></title><description><![CDATA[
<p>Depending on your lambda calculus! From a categorical perspective a lambda calculus is just a nice syntax for Cartesian closed categories (or similar, e.g. *-autonomous categories for linear lambda calculus) so you can use it to reason about anything you can fit into that mould. For example, Paul Taylor likes to do exactly this: <a href="https://www.paultaylor.eu/ASD/analysis#lamcra" rel="nofollow">https://www.paultaylor.eu/ASD/analysis#lamcra</a></p>
]]></description><pubDate>Mon, 13 Apr 2026 13:12:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=47751465</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=47751465</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47751465</guid></item><item><title><![CDATA[New comment by Twey in "Why are we still using Markdown?"]]></title><description><![CDATA[
<p>If we're going to define a programming language as one that is Turing complete, it's important (in a kind of pedantic sense) to note that that includes HTML (with CSS), which can be used to encode a Rule 110 automaton, and excludes C, whose standard imposes an (implementation-defined) upper bound on accessible memory, meaning it can never, even in principle†, similarly a Turing machine, which has infinite storage. This is probably not what was intended :)<p>† Obviously, for physical reasons given our current understanding of cosmology, no _implementation_ of a language can ever really be Turing-complete, but some language definitions are theoretically compatible with Turing-completeness, and others aren't.</p>
]]></description><pubDate>Sat, 04 Apr 2026 13:20:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=47638834</link><dc:creator>Twey</dc:creator><comments>https://news.ycombinator.com/item?id=47638834</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47638834</guid></item></channel></rss>