<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: thomasmg</title><link>https://news.ycombinator.com/user?id=thomasmg</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 12 Apr 2026 19:35:58 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=thomasmg" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by thomasmg in "Tofolli gates are all you need"]]></title><description><![CDATA[
<p>So if I understand correctly, you are saying the observer doesn't feel like he is in a superposition (multiple states at once). Sure: I agree that observers never experience being in a superposition.<p>But don't think that necessarily means we are in a Many-Worlds. I rather think that we don't have enough knowledge in this area. Assuming we live in a simulation, an alternative explanation would be, that unlikely branches are not further simulated to save energy. And in this case, superposition is just branch prediction :-)</p>
]]></description><pubDate>Sun, 12 Apr 2026 18:46:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=47743009</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47743009</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47743009</guid></item><item><title><![CDATA[New comment by thomasmg in "Tofolli gates are all you need"]]></title><description><![CDATA[
<p>(This is way beyond my area of expertise so excuse me that this might be a stupid idea.)<p>I assume the following happens: while a (small) subsystem is in "pure state" (in quantum coherence), no information flows out of this subsystem. Then, when measuring, information flows out and other information flows in, which disturbs the pure state. This collapses of the wave function (quantum decoherence). For all practical purposes, it looks like quantum decoherence is irreversible, but technically this could still be reversible; it's just that the subsystem (that is in coherence) got much, much larger. Sure, for all practical purposes it's then irreversible, but for us most of physics anyway looks irreversible (eg. black holes).</p>
]]></description><pubDate>Sun, 12 Apr 2026 16:45:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=47741772</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47741772</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47741772</guid></item><item><title><![CDATA[New comment by thomasmg in "Tofolli gates are all you need"]]></title><description><![CDATA[
<p>Why do you think so? The code example shows that you can do RLE (run length encoding) without noise / additional space. I'm pretty sure you can do zip as well. It would just be very hard to implement, but it wouldn't necessarily require that the output contains noise.<p>[1] <a href="https://topps.diku.dk/pirc/?id=janusP" rel="nofollow">https://topps.diku.dk/pirc/?id=janusP</a></p>
]]></description><pubDate>Sun, 12 Apr 2026 14:00:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=47739760</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47739760</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47739760</guid></item><item><title><![CDATA[New comment by thomasmg in "Tofolli gates are all you need"]]></title><description><![CDATA[
<p>Yes you can do compression, if the text is compressible. The playground [1] has a "run length encoding" example.<p>Maybe you meant sorting. You can implement sorting algorithms, as long as you store the information which entries were swapped. (To "unsort" the entries when running in reverse). So, an array that is already sorted doesn't need much additional information; one that is unsorted will require a lot of "undo" space. I think this is the easiest example to see the relation between reversible computing and thermodynamics: in thermodynamics, to bring "order" to a system requires "unorder" (heat) somewhere else.<p>There are also examples for encryption / decryption, but I find compression and sorting more interesting.<p>[1] <a href="https://topps.diku.dk/pirc/?id=janusP" rel="nofollow">https://topps.diku.dk/pirc/?id=janusP</a></p>
]]></description><pubDate>Sun, 12 Apr 2026 13:11:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47739222</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47739222</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47739222</guid></item><item><title><![CDATA[New comment by thomasmg in "Tofolli gates are all you need"]]></title><description><![CDATA[
<p>There is a programming language that is reversible: Janus [1]. You could write a (lossless) data compression algorithm in this language, and if run in reverse this would uncompress. In theory you could do all types of computation, but the "output" (when run forward) would need to contain the old state. With reversible computing, there is no erased information. Landauer's principle links information theory with thermodynamics: putting order to things necessarily produces heat (ordering something locally requires "disorder" somewhere else). That is why  Toffoli gates are so efficient: if the process is inherently reversible, less heat need to be produced. Arguably, heat is not "just" disorder: it is a way to preserve the information in the system. The universe is just one gigantic reversible computation. An so, if we all live in a simulation, maybe the simulation is written in Janus?<p>[1] <a href="https://en.wikipedia.org/wiki/Janus_(time-reversible_computing_programming_language)" rel="nofollow">https://en.wikipedia.org/wiki/Janus_(time-reversible_computi...</a></p>
]]></description><pubDate>Sun, 12 Apr 2026 11:36:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=47738495</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47738495</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47738495</guid></item><item><title><![CDATA[New comment by thomasmg in "Axios compromised on NPM – Malicious versions drop remote access trojan"]]></title><description><![CDATA[
<p>The problem of XPath 3.1 is that it is very complex [1] - this is a long page. Compared to the 1.0 spec, it is just too complex in my view. For the open source project I'm working on, I never felt that the "old" XPath version is painful.<p>I think simplicity is better. That's why Json is used nowadays, and XML is not.<p>[1] <a href="https://www.w3.org/TR/xpath-31/" rel="nofollow">https://www.w3.org/TR/xpath-31/</a>
[2] <a href="https://jackrabbit.apache.org/oak/docs/query/grammar-xpath.html" rel="nofollow">https://jackrabbit.apache.org/oak/docs/query/grammar-xpath.h...</a></p>
]]></description><pubDate>Fri, 10 Apr 2026 10:37:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=47716041</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47716041</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47716041</guid></item><item><title><![CDATA[New comment by thomasmg in "War on Raze"]]></title><description><![CDATA[
<p>> more overloaded than Perl by someone who maybe isn't so great at clear communications.<p>I have the same feeling. The root of K is APL, but to avoid special characters (I assume), the same symbol has multiple meanings (overloaded), depending on eg. the position, the data type, and the context. The idea is that "programs should be short enough to fit in your head." The challenge is, similar to Perl and Regex syntax, it's very hard and often cryptic to read.<p>I do think a concise syntax is useful, for a programming language. But at the same time, the syntax should be readable, and that probably means that each symbol or operator must only have one meaning, and that meaning should be (more or less) obvious.<p>K is an array language. Even an integer is actually an array of one element. I think that makes sense for a tiny language: This is the simplest possible type system. You can even support strings, when using eg. metadata or using a heuristic like "a string is always zero terminated" (which is what I used for my tiny language).</p>
]]></description><pubDate>Fri, 10 Apr 2026 10:15:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=47715896</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47715896</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47715896</guid></item><item><title><![CDATA[New comment by thomasmg in "Axios compromised on NPM – Malicious versions drop remote access trojan"]]></title><description><![CDATA[
<p>The point is that you don't need the very latest version. The 20 years old version is enough.</p>
]]></description><pubDate>Wed, 01 Apr 2026 05:32:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=47597176</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47597176</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47597176</guid></item><item><title><![CDATA[New comment by thomasmg in "My “grand vision” for Rust"]]></title><description><![CDATA[
<p>The syntax in Kotin is: "val name: String? = getName(); if (name != null) { println(name.length) // safe: compiler knows it's not null }"
So, there is no explicit type conversion needed.<p>I'm arguing for integer / and %, there is no need for an explicit "non-zero integer" type: the divisor is just an integer, and the compiler need to have a prove that the value is not zero. For places where panic is fine, there could be a method that explicitly panics in case of zero.<p>I agree an annotation / effect system would be useful, where you can mark sections of the code "panic-free" or "safe" in some sense. But "safe" has many flavors: array-out-of-bounds, division by zero, stack overflow, out-of-memory, endless loop. Ada SPARK allows to prove absence of runtime errors using "pragma annotate". Also Dafny, Lean have similar features (in Lean you can give a prove).<p>>  I think it's fine for division to be exposed as a panicking operation by default<p>That might be true. I think division (by non-constants) is not very common, but it would be good to analyze this in more detail, maybe by analyzing a large codebase... Division by zero does cause issues sometimes, and so the question is, how much of a problem is it if you disallow unchecked division, versus the problems if you don't check.</p>
]]></description><pubDate>Wed, 11 Mar 2026 06:44:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=47332346</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47332346</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47332346</guid></item><item><title><![CDATA[New comment by thomasmg in "My “grand vision” for Rust"]]></title><description><![CDATA[
<p>Thanks a lot! I wasn't aware of Gleam, it really seems simple. I probably wouldn't say "learn in a day", any I'm not sure if it's simpler than Python, but it's statically typed, and this adds some complexity necessarily.</p>
]]></description><pubDate>Tue, 10 Mar 2026 21:28:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=47329015</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47329015</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47329015</guid></item><item><title><![CDATA[New comment by thomasmg in "I built a programming language using Claude Code"]]></title><description><![CDATA[
<p>I would be very interested in this research... I'm trying to write a language that is simple and concise like Python, but fast and statically typed. My gutfeeling is that more concise than Python (J, K, or some code golfing language) is bad for readability, but so is the verbosity of Rust, Zig, Java.</p>
]]></description><pubDate>Tue, 10 Mar 2026 19:11:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47327580</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47327580</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47327580</guid></item><item><title><![CDATA[New comment by thomasmg in "My “grand vision” for Rust"]]></title><description><![CDATA[
<p>Well, the parent wrote "I honestly just don't believe that Rust is more complex to onboard to compared to languages like Python." And you wrote "The language itself is not more complex to onboard." So... to contract Rust with Scala, I think it's clearer to write "The language itself is not more complex to onboard _than Scala_."<p>To that, I completely agree! Scala is one of the most complex languages, similar to C++. In terms of complexity (roughly the number of features) / hardness to onboard, I would have the following list (hardest to easiest): C++, Scala, Rust, Zig, Swift, Nim, Kotlin, JavaScript, Go, Python.</p>
]]></description><pubDate>Tue, 10 Mar 2026 06:54:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=47319867</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47319867</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47319867</guid></item><item><title><![CDATA[New comment by thomasmg in "My “grand vision” for Rust"]]></title><description><![CDATA[
<p>> the article was not intended to users but to other language designers.<p>That might be true, but it shows the direction that Rust is talking: put in the kitchen sink, just like C++ and Scala did. And _that_ is very much important for users.</p>
]]></description><pubDate>Mon, 09 Mar 2026 15:02:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=47310036</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47310036</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47310036</guid></item><item><title><![CDATA[New comment by thomasmg in "My “grand vision” for Rust"]]></title><description><![CDATA[
<p>Hm, you claim that Rust and Scala are not more complex to onboard than Python... but then you say you never used Python? If that's the case, how do you know? Having used both, I do think Rust is harder to onboard, just because there is more syntax that you need to learn. And Rust is a lot more verbose. And that's before you are exposed to the borrow checker.</p>
]]></description><pubDate>Mon, 09 Mar 2026 14:56:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47309970</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47309970</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47309970</guid></item><item><title><![CDATA[New comment by thomasmg in "My “grand vision” for Rust"]]></title><description><![CDATA[
<p>> the only feasible compiler solutions to preventing division-by-0 errors are either: defining the behaviour, which always ends up surprising people later on, or; incredibly cumbersome or underperformant type systems/analyses which ensure that denominators are never 0.<p>I don't think it's very cumbersome if the compiler checks if the divisor could be zero. Some programming languages (Kotlin, Swift, Rust, Typescript...) already do something similar for possible null pointer access: they require that you add a check "if s == null" before the access. The same can be done for division (and remainder / modulo). In my own programming language, this is what I do: you can not have a division by zero at runtime, because the compiler does not allow it [1]. In my experience, integer division by a variable is not all that common in reality. (And floating point division does not panic, and integer division by a non-zero constant doesn't panic either). If needed, one could use a static function that returns 0 or panics or whatever is best.<p>[1] <a href="https://github.com/thomasmueller/bau-lang/blob/main/README.md#division-by-zero" rel="nofollow">https://github.com/thomasmueller/bau-lang/blob/main/README.m...</a></p>
]]></description><pubDate>Mon, 09 Mar 2026 14:49:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47309885</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47309885</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47309885</guid></item><item><title><![CDATA[New comment by thomasmg in "Ask HN: What Are You Working On? (March 2026)"]]></title><description><![CDATA[
<p>Objects and structs are described in "Types" [1]. There are no typed unions currently (maybe I'll add them, not sure yet), but there are "Traits" [2].<p>[1] <a href="https://github.com/thomasmueller/bau-lang#types" rel="nofollow">https://github.com/thomasmueller/bau-lang#types</a>
[2] <a href="https://github.com/thomasmueller/bau-lang#traits" rel="nofollow">https://github.com/thomasmueller/bau-lang#traits</a></p>
]]></description><pubDate>Mon, 09 Mar 2026 11:43:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=47307771</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47307771</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47307771</guid></item><item><title><![CDATA[New comment by thomasmg in "Ask HN: What Are You Working On? (March 2026)"]]></title><description><![CDATA[
<p>Since about two years I'm working on a new systems programming language [1] that is supposed to be nearly as fast as C, memory safe, and as concise and easy to learn as Python. Right now I'm trying to integrate Perceus, the ref-count optimization of Keka.<p>[1] <a href="https://github.com/thomasmueller/bau-lang" rel="nofollow">https://github.com/thomasmueller/bau-lang</a></p>
]]></description><pubDate>Mon, 09 Mar 2026 11:00:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=47307433</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47307433</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47307433</guid></item><item><title><![CDATA[New comment by thomasmg in "Best performance of a C++ singleton"]]></title><description><![CDATA[
<p>Optimizing requires a (performane) problem, and often needs a benchmark.<p>In my view, the article is not about optimizing, but about understanding how things work under the hood. Which is interesting for some.</p>
]]></description><pubDate>Sun, 08 Mar 2026 07:14:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47295274</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47295274</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47295274</guid></item><item><title><![CDATA[New comment by thomasmg in "Microgpt"]]></title><description><![CDATA[
<p>I asked ChatGPT to translate (the free version), pasting the source code. The resulting Java code came back a second later.</p>
]]></description><pubDate>Wed, 04 Mar 2026 20:46:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=47253546</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47253546</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47253546</guid></item><item><title><![CDATA[New comment by thomasmg in "Microgpt"]]></title><description><![CDATA[
<p>I got a convertion to Java. It worked (at least I think...) in the first try.<p>Then I want to convert this to my own programming language (which traspiles to C). I like those tiny projects very much!</p>
]]></description><pubDate>Sun, 01 Mar 2026 19:48:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47210011</link><dc:creator>thomasmg</dc:creator><comments>https://news.ycombinator.com/item?id=47210011</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47210011</guid></item></channel></rss>