<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: alethic</title><link>https://news.ycombinator.com/user?id=alethic</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 03 Aug 2026 00:28:24 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=alethic" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by alethic in "Postmortem for Kernel Soundness Bug #14576"]]></title><description><![CDATA[
<p>(I should note that there is also utility in confirming the correctness of results that are too complex to be adequately verified by humans. The recent result that NF is consistent wrt. ZFC, among others (Peter Scholze's Liquid Tensors project) are examples of this. But that's distinct from "autoformalization" as commonly applied.)</p>
]]></description><pubDate>Sun, 02 Aug 2026 18:47:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=49147178</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=49147178</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49147178</guid></item><item><title><![CDATA[New comment by alethic in "Postmortem for Kernel Soundness Bug #14576"]]></title><description><![CDATA[
<p>The utility of autoformalization is not actually in confirming the correctness of human-checked results. Mathematicians have a pretty good peer review process. I'm not actually aware offhand of any mathematical results that were accepted and later found to be incorrect -- though I'm sure cases exist, it's astoundingly rare.<p>The mathematics community's motivation for formalizing problems like Maryna Viazovska's sphere packing results in Lean weren't because the results were in doubt -- she won a Fields Medal for it, it's an extremely examined proof -- but because formalizing those results would lead to a lot of interesting and useful mathematical objects needing to be formalized as a prerequisite, which could then be merged into Lean's Mathlib and become useful for anyone working with Lean, particularly students. Having a library of idiomatic proofs available in a formal system capable of checking your work is Really Cool! Working in a proof assistant is a great way to develop mathematical maturity, especially for people who might not have an undergraduate education available to them.<p>(Unfortunately in the sphere packing case, the research group working on it made the mistake of trusting one of the various "AI for Math" slop companies, who promptly rugpulled them: <a href="https://arxiv.org/html/2603.03684v3" rel="nofollow">https://arxiv.org/html/2603.03684v3</a>)<p>So the short answer is "it depends on what you want". Lean is an eminently usable system for humans and LLMs alike; Metamath is uh. Not. But yes, Metamath seems to have a more trustable kernel wrt. the independent verifiers, so if that's all you're after it would be a better pick. But... there's only so many bugs Lean's kernel can have. At some point, they'll all be found.</p>
]]></description><pubDate>Sun, 02 Aug 2026 06:15:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=49141629</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=49141629</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49141629</guid></item><item><title><![CDATA[New comment by alethic in "Chat Control 1.0 and 2.0 Explained"]]></title><description><![CDATA[
<p>This is of course a massive privacy violation, since the code that scans for CSAM can be switched out to scan for anything else at any time. (It's even easier to do now than when Apple first proposed it, as language models since have gotten good at reading images.)</p>
]]></description><pubDate>Wed, 08 Jul 2026 00:18:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=48825812</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=48825812</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48825812</guid></item><item><title><![CDATA[New comment by alethic in "A New Typst Template for Pandoc (2025)"]]></title><description><![CDATA[
<p>Pandoc templates use $...$ or ${...} for variable substitution, yes. body is one of the special default variables: the rest are documented in the manual. If you scroll to the bottom of the template linked from the article, you'll notice a $body$, along with a number of $if(...)$ $endif$ conditionals.<p>(This actually interferes with Typst's math mode. But you can manually construct math blocks, so no real problem. Pandoc variables are only valid within templates anyway.)<p><a href="https://pandoc.org/MANUAL.html#variables-set-automatically" rel="nofollow">https://pandoc.org/MANUAL.html#variables-set-automatically</a></p>
]]></description><pubDate>Thu, 28 May 2026 03:52:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48304289</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=48304289</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48304289</guid></item><item><title><![CDATA[New comment by alethic in "Rewrite Bun in Rust has been merged"]]></title><description><![CDATA[
<p>Don't forget the image rendering library!</p>
]]></description><pubDate>Fri, 15 May 2026 07:35:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=48145649</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=48145649</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48145649</guid></item><item><title><![CDATA[New comment by alethic in "Zig → Rust porting guide"]]></title><description><![CDATA[
<p>In the context of this post, that's absolutely hilarious they're vibe-porting their Zig codebase to <i>Rust</i>.<p>I love Rust, but you couldn't pick a language with slower compile times... XD</p>
]]></description><pubDate>Tue, 05 May 2026 07:36:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=48019227</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=48019227</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48019227</guid></item><item><title><![CDATA[New comment by alethic in "femtolisp: A lightweight, robust, scheme-like Lisp implementation"]]></title><description><![CDATA[
<p>Recently, some 9front developers have picked up femtolisp, and are hacking it into something for their own use. <a href="https://sr.ht/~ft/StreetLISP/" rel="nofollow">https://sr.ht/~ft/StreetLISP/</a><p>I believe its adoption was motivated by needing to write/generate an OTF parser.</p>
]]></description><pubDate>Tue, 24 Feb 2026 02:00:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=47131917</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=47131917</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47131917</guid></item><item><title><![CDATA[New comment by alethic in "WebAssembly from the Ground Up"]]></title><description><![CDATA[
<p>(It doesn't help that the syntax is *weird*. You've got your choice of an S-expression Scheme syntax or a stack-oriented ML syntax, *and* you can use both together. And there's at least one undocumented <i>de facto</i> syntax floating around AFAIK, though I believe the standard merged support for the main features it was used for, so hopefully test suites and the like will switch away from it at some point.)</p>
]]></description><pubDate>Fri, 21 Nov 2025 20:57:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=46008909</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=46008909</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46008909</guid></item><item><title><![CDATA[New comment by alethic in "WebAssembly from the Ground Up"]]></title><description><![CDATA[
<p>Yes, I have had the same experience with the specification. It really is quite difficult to follow :c<p>Their SpecTec system is fancy and neat but I don't think that auto-generated specifications produce something worth reading. Perhaps in the future when there's less churn, there might be a hand-written specification? In the mean time I've needed to jump into their Discord to ask clarification questions about the high-level stuff. Once understanding that and the grammar conventions and the like, the specification becomes much more readable, though still not great.<p>Certainly nothing like an RFC. But maybe I have too high standards...</p>
]]></description><pubDate>Fri, 21 Nov 2025 20:51:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=46008836</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=46008836</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46008836</guid></item><item><title><![CDATA[New comment by alethic in "Introduction to GrapheneOS"]]></title><description><![CDATA[
<p>No one else has tried implementing the RCS standard.<p>There just aren't any open-source Android libraries for RCS out there, much less anything in AOSP.<p><a href="https://github.com/search?q=rcs+android&type=repositories" rel="nofollow">https://github.com/search?q=rcs+android&type=repositories</a></p>
]]></description><pubDate>Sun, 14 Sep 2025 22:31:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=45243936</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45243936</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45243936</guid></item><item><title><![CDATA[New comment by alethic in "Algebraic Effects in Practice with Flix"]]></title><description><![CDATA[
<p>They are similar, but effect handlers are more powerful and more amenable to typing.<p><a href="https://lobste.rs/s/q8lz7a/what_s_condition_system_why_do_you_want_one#c_pw7da1" rel="nofollow">https://lobste.rs/s/q8lz7a/what_s_condition_system_why_do_yo...</a></p>
]]></description><pubDate>Sun, 07 Sep 2025 18:55:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=45161100</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45161100</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45161100</guid></item><item><title><![CDATA[New comment by alethic in "Algebraic Effects in Practice with Flix"]]></title><description><![CDATA[
<p>The checked exceptions analogy is a good one. Thinking of effect handlers as <i>resumable</i> checked exceptions with some syntactic sugar is very accurate. For someone with a Haskell background, thinking about them as "dependency injection" is also helpful (and these notions are equivalent!) but for the Java heads out there, yeah, resumable checked exceptions provides a really good mental model for what effect handlers are doing with the call stack in the general case.</p>
]]></description><pubDate>Sun, 07 Sep 2025 17:51:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=45160507</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45160507</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45160507</guid></item><item><title><![CDATA[New comment by alethic in "Algebraic Effects in Practice with Flix"]]></title><description><![CDATA[
<p>It's similar on the surface. Another language, Effekt, does actually use interfaces for their effect declarations rather than having a separate `eff` declaration.<p>The difference comes in their use. There's two things of note.
First, the implementation of an interface is static. It's known at compile time. For any given concrete type, there is at most one implementation of MovieApi. You're using the interface, then, to be generic over some number of concrete types, by way of only specifying what you need. Effect handlers aren't like this. Effect handlers can have <i>many</i> implementations, actually. This is useful in the case of ex. adding logging, or writing tests to simulate I/O without actually doing it, or just having different behavior at different places across the program / call stack...<p><pre><code>    eff MovieApi {
      def getPopularMovies();
    }
    def main() {
      run {
        println("Alice's movies: ", getPopularMovies());
      } with handler MovieApi {
        def getPopularMovies() = [
          "Dr. Strangelove", 
          "Lawrence of Arabia",
          "The End of Evangelion",
          "I Saw the TV Glow"
        ];
      }
      run {
        println("Bob's movies: ", getPopularMovies());
      } with handler MovieApi {
        def getPopularMovies() = [
          "The Magic School Bus: Space Adventures",
          "Spy Kids 3-D: Game Over",
          "Twilight: Breaking Dawn: Part II"
        ];
      }
    }
</code></pre>
Second, the effects of effect handlers are not functions. They're under no obligation to "return", and in fact, in many of the interesting cases they don't. The `resume` construct mentioned in the article is a very special construct: it is taking the "continuation" of the program at the place where an effect was performed and providing it to the handler for use. The invocation of resume(5) with a value looks much like a return(5), yes. But: a call to resume 1) doesn't have to happen and the program can instead continue after the handler i.e. in the case of an effectful exception, 2) doesn't have to be invoked and the call to resume can instead be packaged up and thunkified and saved to happen later, and 3) doesn't have to happen just once and can be invoked multiple times to implement fancy backtracking stuff. Though this last one is a gimmick and comes at the cost of performance (can't do the fast call stack memcpy you could do otherwise).<p>So to answer your question more briefly, effects differ from interfaces by providing 1) a decoupling of implementation from use and 2) the ability to encompass non-local control flow. This makes them not really compete with interfaces/classes even though the syntax may look similar. You'd want them both, and most effectful languages have them both.</p>
]]></description><pubDate>Sun, 07 Sep 2025 17:37:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=45160356</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45160356</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45160356</guid></item><item><title><![CDATA[New comment by alethic in "Are we decentralized yet?"]]></title><description><![CDATA[
<p>It's currently on on the flagship instance and will be on by default in the upcoming 4.5 release.</p>
]]></description><pubDate>Mon, 01 Sep 2025 18:19:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=45095217</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45095217</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45095217</guid></item><item><title><![CDATA[New comment by alethic in "A review of Nim 2: The good and bad with example code"]]></title><description><![CDATA[
<p>The short answer is you'd write your code the same, then add .cyclic annotations on cyclic data structures.<p>("The same" being a bit relative, here. Nim's sum types are quite a bit worse than those of an ML. Better than Go's, at least.)</p>
]]></description><pubDate>Mon, 01 Sep 2025 17:08:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=45094526</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45094526</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45094526</guid></item><item><title><![CDATA[New comment by alethic in "A review of Nim 2: The good and bad with example code"]]></title><description><![CDATA[
<p>ORC/ARC are a reference counting garbage collector. There's a bit of a terminological clash out there as to whether "garbage collection" includes reference counting (it's common for it to not, despite reference counting... being a runtime system that collects garbage). Regardless: what makes ORC/ARC interesting is that it optimizes away some/most counts statically, by looking for linear usage and eliding counts accordingly. This is the same approach taken by the Perseus system in use in some Microsoft languages like Koka and Lean, but came a little earlier, and doesn't do the whole "memory reuse" thing the Perseus system does.<p>So for ergonomics: reference counting is not a complete system. It's memory safe, but it can't handle <i>reference cycles</i> really very well -- since if two objects retain a reference to each other there'll always be a reference to the both of them and they'll never be freed, even if nothing else depends on them. The usual way to handle this is to ship a "cycle breaker" -- a mini-tracing collector -- alongside your reference counting system, which while is a little nondeterministic works very reasonably well.<p>But it's a little nondeterministic. Garbage collectors that trace references, and especially tracing systems with the fast heap ("nursery" or "minor heap") / slow heap ("major heap") generational distinction are <i>really</i> good. There's a reason tracing collectors are used among most languages -- ORC/ARC and similar systems have put reference counting back in close competition with tracing, but it's still somewhat slower. Reference counting offers one alternative, though -- the performance is <i>deterministic</i>. You have particular points in the code where destructors are injected, sometimes without a reference check (if the ORC/ARC optimization is good) and sometimes with a reference check, but you know your program will deallocate <i>only at those points</i>. This isn't the case for tracing GCs, where the garbage collector is more along the lines of a totally separate program that barges in and performs collections whenever it so desires. Reference counting offers an advantage here. (Also in interop.)<p>So, while you do need a cycle breaker to not potentially leak memory, Nim tries to get it to do as little as possible. One of these tools they provide to the user is the .acyclic pragma. If you have a data structure that looks like it <i>could</i> be cyclic but you know is <i>not</i> cyclic -- for example, a tree -- you can annotate it with the .acyclic pragma to tell the compiler not to worry about it. The compiler has its own (straightforward) heuristics, too, and so if you don't have any cyclic data in your program and let the compiler know that... it just won't include the cycle collector altogether, leaving you with a program with predictable memory patterns and behavior.<p>What these .cyclic annotations will do in Nim 3.0, reading the design documentation, is replace the .acyclic annotations. The compiler will assume all data is acyclic, and only include the cycle breaker if the user tells it to by annotating some cyclic data structure as such. This means if the user messes up they'll get memory leaks, but in the usual case they'll get access to this predictable performance. Seems like a good tradeoff for the target audience of Nim and seems like a reasonable worst-case -- memory leaks sure aren't the same thing as memory unsafety and I'm interested to see design decisions that strike a balance between burden on the programmer vs. burden on performance, w/o being terribly unsafe in the C or C++ fashion.</p>
]]></description><pubDate>Mon, 01 Sep 2025 17:06:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=45094510</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45094510</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45094510</guid></item><item><title><![CDATA[New comment by alethic in "Are we decentralized yet?"]]></title><description><![CDATA[
<p>I'm not very interested in arguing over the ins and outs of "user expectations" and Mastodon vs. Bluesky, sorry. I would suggest you try it yourself and come to your own conclusion about whether this is a usable system :^)</p>
]]></description><pubDate>Sun, 31 Aug 2025 00:07:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=45079136</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45079136</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45079136</guid></item><item><title><![CDATA[New comment by alethic in "Are we decentralized yet?"]]></title><description><![CDATA[
<p>I expect them to be unimportant. This has been merged upstream and running on the flagship Mastodon instance for a little while now.<p>There is also a section related to performance available at the link I posted. Third header, "Likely Concerns", second subheader, "DoS/Amplification".</p>
]]></description><pubDate>Sat, 30 Aug 2025 23:36:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=45078966</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45078966</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45078966</guid></item><item><title><![CDATA[New comment by alethic in "Are we decentralized yet?"]]></title><description><![CDATA[
<p>There is a detailed explanation available at the link I posted. Second header, "Approach".</p>
]]></description><pubDate>Sat, 30 Aug 2025 22:00:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=45078358</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45078358</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45078358</guid></item><item><title><![CDATA[New comment by alethic in "Are we decentralized yet?"]]></title><description><![CDATA[
<p>This isn't correct. Mastodon merged fetch-all-replies in March. <a href="https://github.com/mastodon/mastodon/pull/32615" rel="nofollow">https://github.com/mastodon/mastodon/pull/32615</a><p>The only difference in visible replies is in the moderation choices of the server the post is viewed from.</p>
]]></description><pubDate>Sat, 30 Aug 2025 21:14:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=45078071</link><dc:creator>alethic</dc:creator><comments>https://news.ycombinator.com/item?id=45078071</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45078071</guid></item></channel></rss>