<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: skitter</title><link>https://news.ycombinator.com/user?id=skitter</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 03 Aug 2026 23:40:16 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=skitter" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by skitter in "Rust project goals: Immobile types and guaranteed destructors"]]></title><description><![CDATA[
<p>Although not part of the goal, it also mentions `!Destruct`/"must-move types", aka linear types: Instead of there always being a way to drop values without providing any arguments, if you wanna get rid of a value of a linear type you have to call a function that takes it by value.</p>
]]></description><pubDate>Mon, 03 Aug 2026 07:49:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=49152537</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=49152537</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49152537</guid></item><item><title><![CDATA[New comment by skitter in "Rust project goals: Immobile types and guaranteed destructors"]]></title><description><![CDATA[
<p>By doing the same as with `Sized`: Automatically including the `Forget` bound on generic parameters and letting methods that don't need to be able to forget them opt out. That way existing code continues to compile and existing unsafe code doesn't become unsound.</p>
]]></description><pubDate>Mon, 03 Aug 2026 07:39:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=49152463</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=49152463</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49152463</guid></item><item><title><![CDATA[New comment by skitter in "Python 3.15's JIT is now back on track"]]></title><description><![CDATA[
<p>Why would it be UB? All objects are behind (thin) pointers, which can be overwritten atomically.</p>
]]></description><pubDate>Wed, 18 Mar 2026 15:45:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=47427239</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=47427239</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47427239</guid></item><item><title><![CDATA[New comment by skitter in "UK Discord users were part of a Peter Thiel-linked data collection experiment"]]></title><description><![CDATA[
<p>I don't understand – what's the point of <i>not</i> collecting mass amounts of personal identity documents and face scans and linking them to online identities?</p>
]]></description><pubDate>Mon, 16 Feb 2026 19:57:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=47039509</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=47039509</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47039509</guid></item><item><title><![CDATA[New comment by skitter in "Inside Rust's std and parking_lot mutexes – who wins?"]]></title><description><![CDATA[
<p>I do the same in my toy JVM (to implement the reentrant mutex+condition variable that every Java object has), except I've got a rare deadlock somewhere because, as it turns out, writing complicated low level concurrency primitives is kinda hard :p</p>
]]></description><pubDate>Tue, 25 Nov 2025 02:09:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=46041647</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=46041647</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46041647</guid></item><item><title><![CDATA[New comment by skitter in "Pontevedra, Spain declares its entire urban area a "reduced traffic zone""]]></title><description><![CDATA[
<p>They're great, compared to cars. But while they have a relatively fast and cheap setup, over the long term light rail and trams are a lot cheaper to run and can coexist with foot & bike traffic easier since the rails make them very predictable.</p>
]]></description><pubDate>Wed, 10 Sep 2025 13:45:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=45197605</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=45197605</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45197605</guid></item><item><title><![CDATA[New comment by skitter in "Type-safe and user-friendly error handling in Swift 6"]]></title><description><![CDATA[
<p>> for the sole purpose of not having to add them to function signatures all over the place.<p>I thought it was because you couldn't be fully generic over exceptions.</p>
]]></description><pubDate>Fri, 05 Sep 2025 08:59:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=45136467</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=45136467</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45136467</guid></item><item><title><![CDATA[New comment by skitter in "Go is still not good"]]></title><description><![CDATA[
<p>The author obviously knows that too, otherwise they wouldn't have written about it. All of these issues are just how the language works, and that's the problem.</p>
]]></description><pubDate>Fri, 22 Aug 2025 12:43:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=44983885</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=44983885</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44983885</guid></item><item><title><![CDATA[New comment by skitter in "Itch.io: Update on NSFW Content"]]></title><description><![CDATA[
<p>I do not see evidence that they are against violence against women and girls, only that they are claiming to be.</p>
]]></description><pubDate>Thu, 24 Jul 2025 14:02:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=44670821</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=44670821</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44670821</guid></item><item><title><![CDATA[New comment by skitter in "Fun with Futex"]]></title><description><![CDATA[
<p>Yup, that's what I'm doing - storing the two bits needed for an object's monitor in the same word as its compressed class pointer. The pointer doesn't change over the lock's lifetime.</p>
]]></description><pubDate>Tue, 03 Jun 2025 14:21:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=44170446</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=44170446</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44170446</guid></item><item><title><![CDATA[New comment by skitter in "Fun with Futex"]]></title><description><![CDATA[
<p>Fun post! An alternative to using futexes to store thread queues in kernel space is to store them yourself. E.g. the parking_lot[0] Rust crate, inspired by WebKit[1], uses only one byte to store the unlocked/locked/locked_contended state, and under contention uses the address of the byte to index into a global open-addressing hash table of thread queues. You look up the object's entry, lock said entry, add the thread to the queue, unlock it, and go to sleep. Because you know that there is at most one entry per thread, you can keep the load factor very low in order to keep the mutex fast and form the thread queue out of a linked list of thread-locals. Leaking the old hash on resizing helps make resizing safe.<p>As a result, uncontended locks work the same as described in the blog post above; under contention, performance is similar to a futex too. But now your locks are only one byte in size, regardless of platform – while Windows allows 1-byte futexes, they're always 4 bytes on Linux and iirc Darwin doesn't quite have an equivalent api (but I might be wrong there). You also have more control over parked threads if you want to implement different fairness criteria, reliable timeouts or parking callbacks.<p>One drawback of this is that you can only easily use this within one process, while at least on Linux futexes can be shared between processes.<p>I've written a blog post[2] about using futexes to implement monitors (reëntrant mutexes with an associated condvar) in a compact way for my toy Java Virtual Machine, though I've since switched to a parking-lot-like approach.<p>[0]: <a href="https://github.com/amanieu/parking_lot">https://github.com/amanieu/parking_lot</a>
[1]: <a href="https://webkit.org/blog/6161/locking-in-webkit" rel="nofollow">https://webkit.org/blog/6161/locking-in-webkit</a>
[2]: <a href="https://specificprotagonist.net/jvm-futex.html" rel="nofollow">https://specificprotagonist.net/jvm-futex.html</a></p>
]]></description><pubDate>Tue, 03 Jun 2025 13:05:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=44169593</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=44169593</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44169593</guid></item><item><title><![CDATA[New comment by skitter in "Veloren – Voxel action-adventure role-playing"]]></title><description><![CDATA[
<p>If you're interested in how the mountains and rivers are generated, it's mostly based on the paper "Large Scale Terrain Generation from Tectonic Uplift and
Fluvial Erosion": Each chunk rises (at a noise-based, constant rate) while erosion is applied based on the chunk's slope and the size of its catchment area.<p>The result is a river network as well as the central height of each chunk; based on this roads, caves and structures are laid out. The actual voxels are only determined when a player loads the area and are (usually) not persisted.<p>Also, for some technologies not related to worldgen: Rendering is done via wgpu, models are built in MagicaVoxel, and both client and server use an ECS (specs).</p>
]]></description><pubDate>Sat, 29 Mar 2025 18:41:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=43517562</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=43517562</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43517562</guid></item><item><title><![CDATA[New comment by skitter in "Koto Programming Language"]]></title><description><![CDATA[
<p>They're rather different: In Rust types only exist at compile time; dyn Any is a normal trait object, so you can only call the trait's methods. With C#'s dynamic, you can call arbitrary methods and access any fields with type checking of those accesses being delayed until runtime, which works because types exist at runtime too.<p>Rust's dyn Any corresponds better to C#'s Object; dynamic exists to interface with dynamic languages and is rarely used.</p>
]]></description><pubDate>Sat, 29 Mar 2025 16:59:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=43516876</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=43516876</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43516876</guid></item><item><title><![CDATA[New comment by skitter in "Rost – Rust Programming in German"]]></title><description><![CDATA[
<p>Why limit yourself to one language, when you can have 23 of them in the same Datei?<p><a href="https://github.com/charyan/unirust" rel="nofollow">https://github.com/charyan/unirust</a></p>
]]></description><pubDate>Thu, 27 Mar 2025 07:56:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=43491294</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=43491294</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43491294</guid></item><item><title><![CDATA[New comment by skitter in "How does Ada's memory safety compare against Rust?"]]></title><description><![CDATA[
<p>…what? Why bring "AI" into this?</p>
]]></description><pubDate>Mon, 10 Feb 2025 18:28:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=43003464</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=43003464</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43003464</guid></item><item><title><![CDATA[New comment by skitter in "How does Ada's memory safety compare against Rust?"]]></title><description><![CDATA[
<p>I agree about your greater point of learning about history being important, but very much disagree about your specific gripe. What Ironman says is:<p><pre><code>  7.2.F. (7F.)  FORMAL PARAMETER CLASSES
  There shall be three classes of formal data parameters:
  
      input parameters, which act as constants that are initialized to the value of corresponding actual parameters at the time of call,
  
      input-output parameters, which enable access and assignment to the corresponding actual parameters, and
  
      output parameters, which act as local variables whose values are transferred to the corresponding actual parameter only at the time of normal exit. In the latter two cases the corresponding actual parameter must be a variable or an assignable component of a composite type.
  
  7I.  RESTRICTIONS TO PREVENT ALIASING
  
  Aliasing (i.e., multiple access paths to the same variable from a given scope) shall not be permitted. In particular, a variable may not be used as two output arguments in the same call to a procedure, and a nonlocal variable that is accessed or assigned within a procedure body may not be used as an output argument to that procedure.
</code></pre>
These are very reasonable!<p>7I is important (in the mutable case), and solving the problem that bought forth this rule is the core idea behind Rust.<p>7F draws useful semantic distinctions: Output parameters are return values. Input-output parameters are mutable references. Input parameters act as a copy or readonly reference – which are equivalent if you can't mutate or observe mutation through readonly references.<p>Your complaint is that Rust draws a distinction between whether input parameters are implemented via a copy or a reference, but Rust draws many more distictions here – arbitrarily many so, because it's part of the type system. This makes the system both applicable everywhere instead of only in function parameters and allows expressing more different semantics.<p>For example I have a hard time seing how one would, while following the Ironman requirements, distinguish parameter whos type is "dynamic array of elements of T" from one of type "dynamic array of elements of type mutable reference to T". Likewise you can define a record that holds a mutable reference and an immutable reference, or define a new reference type (such as a reference counted pointer) without new language support.<p>I said that passing a copy and a readonly reference are equivalent. However, in Rust there are no readonly references. Rather, there are non-aliasing references, which allow mutation, and aliasing references, which by default don't allow mutation – but types can make use of interior mutability to allow mutation through aliased references according to they rules they need. For example you can access data protected by a mutex if and only if you hold the lock, which means that even if other references to the mutex exist, there are no other references to the inner data.</p>
]]></description><pubDate>Mon, 10 Feb 2025 16:38:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=43002209</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=43002209</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43002209</guid></item><item><title><![CDATA[New comment by skitter in "Go Data Structures: Interfaces (2009)"]]></title><description><![CDATA[
<p>C# inherited this from Java, which added it because it was designed without generics and therefore decided that the additional expressiveness provided by enforced array covariance was worth the tradeoff of having an unsound type system.</p>
]]></description><pubDate>Sun, 09 Feb 2025 09:09:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=42989464</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=42989464</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42989464</guid></item><item><title><![CDATA[New comment by skitter in "Jujutsu VCS: Introduction and patterns"]]></title><description><![CDATA[
<p>> 1. HTTPS Git repository handling is poor. […] 2. Git fetches seem slower for large changes than using Git fetch directly<p>JJ used to use libgit2 for fetches, but it now can shell out to the git binary instead: <a href="https://github.com/jj-vcs/jj/pull/5228">https://github.com/jj-vcs/jj/pull/5228</a> (which will be the default in the future)</p>
]]></description><pubDate>Tue, 04 Feb 2025 18:02:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=42936177</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=42936177</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42936177</guid></item><item><title><![CDATA[New comment by skitter in "Desmos Animated Graphing Calculator"]]></title><description><![CDATA[
<p>If you're interested in conlangs, someone made a language, Grapherit [0], that is "spoken" via the Desmos graphing calculator.<p>[0]: <a href="https://m.youtube.com/watch?v=HP3nIDAhwYo" rel="nofollow">https://m.youtube.com/watch?v=HP3nIDAhwYo</a></p>
]]></description><pubDate>Wed, 29 Jan 2025 14:25:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=42865213</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=42865213</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42865213</guid></item><item><title><![CDATA[New comment by skitter in "What every systems programmer should know about concurrency (2020) [pdf]"]]></title><description><![CDATA[
<p>A miserable pile of secrets.</p>
]]></description><pubDate>Fri, 13 Dec 2024 10:54:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=42407544</link><dc:creator>skitter</dc:creator><comments>https://news.ycombinator.com/item?id=42407544</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42407544</guid></item></channel></rss>