<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: norir</title><link>https://news.ycombinator.com/user?id=norir</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 23 May 2026 09:56:58 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=norir" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by norir in "No way to parse integers in C (2022)"]]></title><description><![CDATA[
<p>This is not a hard thing to do without using a library. The code below is easily adapted to the unsigned case and/or arbitrary base rather than 10.<p><pre><code>    #include <stdio.h>
    int main(int argc, char **argv) {
        if (argc != 2) {
            fprintf(stderr, "usage: require one numeric argument");
        }
        char *nump = argv[1];
        unsigned neg = 0;
        unsigned long long ures = 0;
        if (*nump == '-') {
            neg = 1;
            nump = nump + 1;
        }
        if (!*nump) {
            fprintf(stderr, "require non empty string\n");
            return 1;
        }
        char b;
        while (b = *nump++) {
            if (b >= '0' && b <= '9') {
                unsigned long long nres = (ures * 10) + (b - '0'); 
                if (nres < ures) {
                    fprintf(stderr, "overflow in '%s'\n", argv[1]);
                    return 1;
                }   
                ures = nres;
            } else {
                if (b >= ' ') {
                    fprintf(stderr, "invalid char '%c' in '%s'\n", b, argv[1]); 
                } else {
                    fprintf(stderr, "invalid byte '%d' in '%s'\n", b, argv[1]);
                }
                return 1;  
            }
        }
        long long res = (long long) ures;
        if (neg) {
            if (ures <= 0x8000000000000000ULL) {
                res = -res;
            } else {
                fprintf(stderr, "underflow in '%s'\n", argv[1]);
                return 1;
            }
        } else if (ures > 0x7FFFFFFFFFFFFFFFULL) {
            fprintf(stderr, "overflow in '%s'\n", argv[1]);
            return 1;
        }
        fprintf(stdout, "result: %lld\n", res);
        return 0;
    }</code></pre></p>
]]></description><pubDate>Wed, 20 May 2026 18:38:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48212113</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48212113</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48212113</guid></item><item><title><![CDATA[New comment by norir in "For thirty years I programmed with Phish on, every day"]]></title><description><![CDATA[
<p>The product and the process are not orthogonal.</p>
]]></description><pubDate>Sun, 03 May 2026 17:59:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=47999599</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47999599</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47999599</guid></item><item><title><![CDATA[New comment by norir in "Unsigned sizes: A five year mistake"]]></title><description><![CDATA[
<p>This is true, which means that a language has to be designed from the ground up to deal with these problems or there will always be inscrutable bugs due to misuse of arithmetic results. A simple example in a c-like language would be that the following function would not compile:<p><pre><code>    unsigned foo(unsigned a, unsigned b) { return a - b; }
</code></pre>
but this would:<p><pre><code>    unsigned foo(unsigned a, unsigned b) {
      auto c = a - b;
      return c >= 0 ? c : 0;
    }
</code></pre>
Assuming 32 bit unsigned and int, the type of c should be computed as the range [-0xffffffff, 0xffffffff], which is different from int [-0x100000000, 0x7fffffff]. Subtle things like this are why I think it is generally a mistake to type annotate the result of a numerical calculation when the compiler can compute it precisely for you.</p>
]]></description><pubDate>Sat, 02 May 2026 21:16:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47990622</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47990622</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47990622</guid></item><item><title><![CDATA[New comment by norir in "Unsigned sizes: A five year mistake"]]></title><description><![CDATA[
<p>In my reading, what Stroustroup is saying is that given other problems in c/c++, that singed sizes are less bad than unsigned but both have clear and significant deficiencies. A new language doesn't have to inherit all of these deficiencies.</p>
]]></description><pubDate>Sat, 02 May 2026 20:51:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=47990361</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47990361</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47990361</guid></item><item><title><![CDATA[New comment by norir in "Scoring Show HN submissions for AI design patterns"]]></title><description><![CDATA[
<p>I also expect that most side projects that are made with ai end up abandoned within 3 months and contribute next to nothing to the user's personal development and that the use of ai prevented them from the kind of deliberate practice that could have led to durable skill growth which ultimately will lead to much better work (side or main projects).</p>
]]></description><pubDate>Wed, 22 Apr 2026 15:51:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47865386</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47865386</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47865386</guid></item><item><title><![CDATA[New comment by norir in "Nanopass Framework: Clean Compiler Creation Language"]]></title><description><![CDATA[
<p>This highly depends on the language and your skill as a compiler writer. You can write a single pass assembler that generates great code but you have to of course write the low level code yourself (including manual register assignment). To do decent automatic register assignment, I agree you need at least two passes, but not 10 or more.</p>
]]></description><pubDate>Sun, 19 Apr 2026 20:51:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=47827526</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47827526</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47827526</guid></item><item><title><![CDATA[New comment by norir in "Bringing Clojure programming to Enterprise (2021)"]]></title><description><![CDATA[
<p>You don't need a repl for this workflow and it can be easily implemented in any language. `ls *.MY_LANG | entr -c run.sh` You get feedback whenever you save the file.<p>Personally, I find waiting more than 200ms unacceptable and really < 50ms is ideal. When the feedback is very small, it becomes practical to save the file on every keystroke and get nearly instantaneous results with every input char.</p>
]]></description><pubDate>Thu, 02 Apr 2026 16:41:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=47616793</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47616793</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47616793</guid></item><item><title><![CDATA[New comment by norir in "Intuiting Pratt Parsing"]]></title><description><![CDATA[
<p>It is easily possible to parse at > 1MM lines per second with a well designed grammar and handwritten parser. If I'm editing a file with 100k+ lines, I likely have much bigger problems than the need for incremental parsing.</p>
]]></description><pubDate>Wed, 01 Apr 2026 14:53:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47601757</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47601757</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47601757</guid></item><item><title><![CDATA[New comment by norir in "Some uncomfortable truths about AI coding agents"]]></title><description><![CDATA[
<p>> I recognize that it is reminiscent of a few decades ago when old timers complained about the proliferation of high level programming languages and insisted they would lead to a generation of programmers lacking a proper understanding of how the system behaves beneath all that syntactic sugar and automatic garbage collection. They won’t have the foundational skills necessary to design and build quality software. And, for the most part, they turned out to be wrong.<p>What if the old timers were actually right? I tend to think they were.</p>
]]></description><pubDate>Fri, 27 Mar 2026 22:01:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=47548912</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47548912</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47548912</guid></item><item><title><![CDATA[New comment by norir in "We might all be AI engineers now"]]></title><description><![CDATA[
<p>> In the meantime, there's nothing stopping you from using the agent to write the code that is every bit as high quality as if you sat down and typed it in yourself.<p>You can only speak for yourself.</p>
]]></description><pubDate>Sat, 07 Mar 2026 00:58:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=47283198</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47283198</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47283198</guid></item><item><title><![CDATA[New comment by norir in "Allocating on the Stack"]]></title><description><![CDATA[
<p>If you have well defined boundaries, you can move the stack to an arbitrarily large chunk of memory before the recursive call and restore it to the system stack upon completion.</p>
]]></description><pubDate>Fri, 27 Feb 2026 19:15:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=47184365</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47184365</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47184365</guid></item><item><title><![CDATA[New comment by norir in "Defer available in gcc and clang"]]></title><description><![CDATA[
<p>I have a personal aversion to defer as a language feature. Some of this is aesthetic. I prefer code to be linear, which is to say that instructions appear in the order that they are evaluated. Further, the presence of defer almost always implies that there are resources that can leak silently.<p>I also dislike RAII because it often makes it difficult to reason about when destructors are run and also admits accidental leaks just like defer does. Instead what I would want is essentially a linear type system in the compiler that allows one to annotate data structures that require cleanup and errors if any possible branches fail to execute the cleanup. This has the benefit of making cleanup explicit while also guaranteeing that it happens.</p>
]]></description><pubDate>Fri, 20 Feb 2026 15:32:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=47089270</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47089270</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47089270</guid></item><item><title><![CDATA[New comment by norir in "Choosing a language based on its syntax?"]]></title><description><![CDATA[
<p>I personally would prefer to hear more about what is uniquely good about Odin semantically or syntactically than more ad hominem attacks on the intelligence of the critics of the language, which I have seen in multiple recent pieces by this author.</p>
]]></description><pubDate>Thu, 19 Feb 2026 20:07:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=47078500</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47078500</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47078500</guid></item><item><title><![CDATA[New comment by norir in "Outsourcing thinking"]]></title><description><![CDATA[
<p>Communism is neither the opposite of laissez-faire capitalism nor the only alternative.</p>
]]></description><pubDate>Sun, 01 Feb 2026 11:31:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=46845450</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=46845450</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46845450</guid></item><item><title><![CDATA[New comment by norir in "Outsourcing thinking"]]></title><description><![CDATA[
<p>Model competition does nothing to address monopoly consolidation of compute. If you have control over compute, you can exert control over the masses. It doesn't matter how good my open source model is if I can't acquire the resources to run it. And I have no doubt that the big players will happily buy legislation to both entrench their compute monopoly/cartel and control what can be done using their compute (e.g. making it a criminal offence to build a competitor).</p>
]]></description><pubDate>Sun, 01 Feb 2026 11:30:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=46845444</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=46845444</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46845444</guid></item><item><title><![CDATA[New comment by norir in "Automatic Programming"]]></title><description><![CDATA[
<p>> I'm a programmer, and I use automatic programming. The code I generate in this way is mine. My code, my output, my production. I, and you, can be proud.<p>I disagree. The code you wrote is a collaboration with the model you used. To frame it this way, you are taking credit for the work the model did on your behalf. There is a  difference between I wrote this code entirely by myself and I wrote the code with a partner. For me, it is analogous to the author of the score of an opera taking credit for the libretto because they gave the libretto author the rough narrative arc. If you didn't do it yourself, it isn't yours.<p>I generally prefer integrated works or at least ones that clearly acknowledge the collaboration and give proper credit.</p>
]]></description><pubDate>Sat, 31 Jan 2026 12:04:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=46835879</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=46835879</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46835879</guid></item><item><title><![CDATA[New comment by norir in "Make.ts"]]></title><description><![CDATA[
<p>I consider luajit a much better choice than bash if both maintainability and longterm stability are valued. It compiles from source in about 5 seconds on a seven year old laptop and only uses c99, which I expect to last basically indefinitely.</p>
]]></description><pubDate>Wed, 28 Jan 2026 14:15:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=46795692</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=46795692</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46795692</guid></item><item><title><![CDATA[New comment by norir in "Losing 1½ Million Lines of Go"]]></title><description><![CDATA[
<p>A precomputed lookup table would be about 1MB covering all of then code points. The lookup code would first compute the code point (and also could do validation) and directly look up the class in the table. The lookup table would not need to be directly embedded in go code and could just be stored in a binary file. But I'd imagine it also could be put in an array literal in its own file that would never be opened by an ide if the program needs to be distributed as a single binary.</p>
]]></description><pubDate>Sat, 24 Jan 2026 11:34:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=46742742</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=46742742</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46742742</guid></item><item><title><![CDATA[New comment by norir in "Show HN: Sweep, Open-weights 1.5B model for next-edit autocomplete"]]></title><description><![CDATA[
<p>It is depressing that our collective solution to the problem of excess boilerplate keeps moving towards auto-generation of it.</p>
]]></description><pubDate>Thu, 22 Jan 2026 20:14:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=46724586</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=46724586</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46724586</guid></item><item><title><![CDATA[New comment by norir in "Show HN: Sweep, Open-weights 1.5B model for next-edit autocomplete"]]></title><description><![CDATA[
<p>I personally find autocomplete to be detrimental to my workflow so I disagree that it is a universal productivity improvement.</p>
]]></description><pubDate>Thu, 22 Jan 2026 20:12:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=46724571</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=46724571</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46724571</guid></item></channel></rss>