<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: sjrd</title><link>https://news.ycombinator.com/user?id=sjrd</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Fri, 19 Jun 2026 19:59:13 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=sjrd" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by sjrd in "Lumina – a statically typed web-native language for JavaScript and WASM"]]></title><description><![CDATA[
<p>Have you tried Scala? It checks all the boxes, and is a mature language. The reactive UI runtime is provided by the library Laminar [1].<p>Technically its type inference is not HM but it's as expressive. In particular it has GADTs and HKTs, which I saw in your docs.<p>I wonder what you feel is missing from Scala (its .js/Wasm version) that Lumina provides?<p>[1] <a href="https://laminar.dev/" rel="nofollow">https://laminar.dev/</a></p>
]]></description><pubDate>Tue, 14 Apr 2026 11:43:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=47764333</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=47764333</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47764333</guid></item><item><title><![CDATA[New comment by sjrd in "Someone bought 30 WordPress plugins and planted a backdoor in all of them"]]></title><description><![CDATA[
<p>Try Scala? You only need one 0-dependency library for UI (Laminar), and you're good to go.</p>
]]></description><pubDate>Mon, 13 Apr 2026 20:23:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=47757342</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=47757342</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47757342</guid></item><item><title><![CDATA[New comment by sjrd in "Most people can't juggle one ball"]]></title><description><![CDATA[
<p>Oh waw, I had totally forgotten about the handkerchiefs. But this is indeed how I was first thaught juggling when I was a kid. Thanks for the trip down the memory lane!</p>
]]></description><pubDate>Sun, 12 Apr 2026 21:25:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=47744685</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=47744685</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47744685</guid></item><item><title><![CDATA[New comment by sjrd in "JSIR: A High-Level IR for JavaScript"]]></title><description><![CDATA[
<p>Right. I believe we are in agreement on that.</p>
]]></description><pubDate>Wed, 08 Apr 2026 15:46:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47691815</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=47691815</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47691815</guid></item><item><title><![CDATA[New comment by sjrd in "JSIR: A High-Level IR for JavaScript"]]></title><description><![CDATA[
<p>Only compilers that already had an SSA-based pipeline transform SSA to stack-based for Wasm. And several don't like that they have to comply with Wasm structured control flow (which, granted, is independent from SSA). Compilers that have been using an expression-based IR directly compile to Wasm without using an SSA intermediary.</p>
]]></description><pubDate>Wed, 08 Apr 2026 11:55:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=47688954</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=47688954</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47688954</guid></item><item><title><![CDATA[New comment by sjrd in "JSIR: A High-Level IR for JavaScript"]]></title><description><![CDATA[
<p>It seems to me that there's a certain "blindness" between two compiler worlds.<p>Compiler engineers for mostly linear-memory languages tend to only think in terms of SSA, and assume it's the only reasonable way to perform optimizations. That transpires in this particular article: the only difference between an AST and what they call IR is that the latter is SSA-based. So it's like for them something that's not SSA is not a "serious" data structure in which you can perform optimizations, i.e., it can't be an IR.<p>On the other side, you actually have a bunch of languages, typically GC-based for some reason, whose compilers use expression-based structures. Either in the form of an AST or stack-based IR. These compilers don't lack any optimization opportunities compared to SSA-based ones. However it often happens that compiler authors for those (I am one of them) don't always realize all the optimization set that SSA compilers do, although they could very well be applied in their AST/stack-based IR as well.</p>
]]></description><pubDate>Wed, 08 Apr 2026 04:52:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=47685432</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=47685432</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47685432</guid></item><item><title><![CDATA[New comment by sjrd in "Show HN: The Mog Programming Language"]]></title><description><![CDATA[
<p>Hum, IIRC, using your definition of an AOT compiler, then V8 is an AOT compiler. V8 never interprets code. It immediately compiles it to machine code. It <i>improves</i> it later, but it's never slow.</p>
]]></description><pubDate>Mon, 09 Mar 2026 20:39:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47315164</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=47315164</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47315164</guid></item><item><title><![CDATA[New comment by sjrd in "Show HN: The Mog Programming Language"]]></title><description><![CDATA[
<p>Wasm is definitely designed to be compiled, either ahead of time or JITed. Wasm interpreters are few and far between.</p>
]]></description><pubDate>Mon, 09 Mar 2026 20:25:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47314955</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=47314955</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47314955</guid></item><item><title><![CDATA[New comment by sjrd in "Bitwise conversion of doubles using only FP multiplication and addition (2020)"]]></title><description><![CDATA[
<p>Thanks for the feedback, and congrats on your achievement.<p>We do still maintain this code, although it is deprecated now.<p>Even with the unrolled tests, we would still keep the table for the decoding operation, I believe. But it's true that it would at the same time provide the normalized value. That could be beneficial.</p>
]]></description><pubDate>Mon, 26 Jan 2026 12:41:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=46764935</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=46764935</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46764935</guid></item><item><title><![CDATA[New comment by sjrd in "Bitwise conversion of doubles using only FP multiplication and addition (2020)"]]></title><description><![CDATA[
<p>Interesting. When compiling Scala.js to ECMAScript 5, we still have an implementation of bitwise floating point conversions based on double operations and integer shifts. [1] We also use a lookup table for powers of 2, and don't use anything but primitives (no log or pow, notably). We do have a few divisions, but I see now how I could turn them into multiplications. Dealing with subnormals is tricky because the inverse of the subnormal powers of 2 are not representable.<p>We have one loop: a binary search in the table of powers of 2 for the double-to-bits conversion. It has a fixed number of iterations. I had tried to unroll it, but that did not perform any better.<p>I'll have to dig more to understand how they got rid of the comparisons, though.<p>I wonder whether their implementation would be faster than ours. At the time I wrote our conversions, they beat every previous implementation I was aware of hands down.<p>[1] <a href="https://github.com/scala-js/scala-js/blob/v1.20.2/linker-private-library/src/main/scala/org/scalajs/linker/runtime/FloatingPointBitsPolyfills.scala" rel="nofollow">https://github.com/scala-js/scala-js/blob/v1.20.2/linker-pri...</a></p>
]]></description><pubDate>Mon, 26 Jan 2026 05:52:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=46762272</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=46762272</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46762272</guid></item><item><title><![CDATA[New comment by sjrd in "Stop Doom Scrolling, Start Doom Coding: Build via the terminal from your phone"]]></title><description><![CDATA[
<p>I genuinely did that a few times. Using an ssh client to fix a commit failing CI, for example. Even launching release builds remotely. Notably once when I was on vacation and half the Scala ecosystem was waiting for me.</p>
]]></description><pubDate>Tue, 06 Jan 2026 20:20:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=46518078</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=46518078</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46518078</guid></item><item><title><![CDATA[New comment by sjrd in "DEC64: Decimal Floating Point (2020)"]]></title><description><![CDATA[
<p>JavaScript engines do optimize integers. They usually represent integers up to +-2^30 as integers and apply integer operations to them. But of course that's not observable.</p>
]]></description><pubDate>Mon, 10 Nov 2025 08:13:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=45873651</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45873651</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45873651</guid></item><item><title><![CDATA[New comment by sjrd in "D2: Diagram Scripting Language"]]></title><description><![CDATA[
<p>In Scala you can do it, because you can define your own operators (which are nothing but method names), and you can extend types you don't control. You are a bit constrained by the operator precedence rules, but it's usually good enough.<p>It's bad practice to make DSLs left and right, obviously. But when one is warranted, you can.<p>For example here you could have<p><pre><code>    "x" --> "y" | "hello world"</code></pre></p>
]]></description><pubDate>Sun, 26 Oct 2025 05:51:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=45709460</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45709460</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45709460</guid></item><item><title><![CDATA[New comment by sjrd in "A years-long Turkish alphabet bug in the Kotlin compiler"]]></title><description><![CDATA[
<p>I guess it's one way to look at it. I see it as: I want a reproducible locale, independent of the user's system. If I see US, I'm wondering if it was chosen to be English because the program was written in English. When I localize the program, should I make that locale configurable? ROOT communicates that it must <i>not</i> be configurable, and never dependent on the system.</p>
]]></description><pubDate>Mon, 13 Oct 2025 03:51:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=45564511</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45564511</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45564511</guid></item><item><title><![CDATA[New comment by sjrd in "A years-long Turkish alphabet bug in the Kotlin compiler"]]></title><description><![CDATA[
<p>I am one of the maintainers is the Scala compiler, and this is one of the things that immediately jump to me when I review code that contains any casing operation. Always explicitly specify the locale. However, unlike TFA and other comments, I don't suggest `Locale.US`. That's a little too US-centric. The canonical locale is in fact `Locale.ROOT`. Granted, in practice it's equivalent, but I find it a little bit more sensible.<p>Also, this is the last remaining major system-dependent default in Java. They made strict floating point the default in 17; UTF-8 the default encoding some versions later (21?); only the locale remains. I hope they make ROOT the default in an upcoming version.<p>FWIW, in the Scala.js implementation, we've been using UTF-8 and ROOT as the defaults forever.</p>
]]></description><pubDate>Sun, 12 Oct 2025 21:42:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=45562202</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45562202</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45562202</guid></item><item><title><![CDATA[New comment by sjrd in "Rating 26 years of Java changes"]]></title><description><![CDATA[
<p>Or Scala. Or Kotlin. Or any of the other languages that had most of these features years if not decades before Java. ;)</p>
]]></description><pubDate>Sat, 11 Oct 2025 20:42:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=45552513</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45552513</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45552513</guid></item><item><title><![CDATA[New comment by sjrd in "The Temporal Dead Zone, or why the TypeScript codebase is full of var statements"]]></title><description><![CDATA[
<p>I'm sure it can do that in many cases. But if the scopes are a bit complicated, and in particular when variables are captured in lambdas, it's just not possible. The semantics require the TDZ behavior. If you can statically analyze that the TDZ won't be triggered, you can lower to `var`, but otherwise you have to keep the checks.</p>
]]></description><pubDate>Sat, 04 Oct 2025 05:48:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=45470820</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45470820</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45470820</guid></item><item><title><![CDATA[New comment by sjrd in "The Temporal Dead Zone, or why the TypeScript codebase is full of var statements"]]></title><description><![CDATA[
<p>Usage of Scala.js is steadily growing. Several indicators suggest that 1 in 5 Scala developers use Scala.js at this point. It's regularly brought up as one of the strongest suits of Scala.<p>Usage of Scala itself is less shiny if you look at market share. But I believe it's still growing in absolute numbers, only quite slowly.</p>
]]></description><pubDate>Sat, 04 Oct 2025 05:45:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=45470805</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45470805</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45470805</guid></item><item><title><![CDATA[New comment by sjrd in "The Temporal Dead Zone, or why the TypeScript codebase is full of var statements"]]></title><description><![CDATA[
<p>Indeed, `let`s and `const`s incur a significant performance penalty. This is also why the Scala.js compiler emits `var`s by default, even when targeting very recent versions of ECMAScript.<p>The good news is that we can still write our Scala `val`s and `var`s (`const` and `let`) in the source code, enjoying good scoping <i>and</i> good performance.</p>
]]></description><pubDate>Fri, 03 Oct 2025 22:47:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=45468717</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45468717</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45468717</guid></item><item><title><![CDATA[New comment by sjrd in "Why do some gamers invert their controls?"]]></title><description><![CDATA[
<p>I'm not surprised. I have introduced several people to gaming, both adults and children. I let them all start with the default settings, and I don't even tell them there are settings. Then I observe their movements. I observe whether they consistently (or very often) start looking the wrong way before correcting. If they do that a lot, I change the settings, and it's smooth sailing from there.<p>So from my anecdotal perspective, explanations based on previous experience make no sense. It had to be something more innate, more related to how our brains are "wired".<p>Some people invert Y but not X. This is the most surprising to me. Most I've seen invert both. I don't remember having seen someone invert X but not Y.<p>Personally I invert both, except for games with a mouse to <i>aim</i> (like 3rd person shooters). In that case I invert neither. Go figure.</p>
]]></description><pubDate>Sat, 20 Sep 2025 23:00:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=45318376</link><dc:creator>sjrd</dc:creator><comments>https://news.ycombinator.com/item?id=45318376</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45318376</guid></item></channel></rss>