A Lisp adventure on the calm waters of the dead C (2021)

(mihaiolteanu.me)

47 points | by caned 3 days ago

1 comments

  • lproven 2 hours ago
    Previously:

    https://news.ycombinator.com/item?id=28851992

    https://news.ycombinator.com/item?id=44359454

    No comments on any of them.

    It sounded of interest to me, but I read it and closed the tab within a page or so as it wandered off into tech arcana. Shame. There may be an interesting idea in here but it's phrased in terms I think few will be able to follow and understand.

    I did not finish it but I saw no mention of the lambda calculus or of currying, both of which -- from my very meagre understanding -- seem directly relevant to what I understood to be the core point, which seems to be about anonymous functions.

    • dreamcompiler 38 minutes ago
      Currying is done automatically in Haskell but not in Lisp. If you wanted currying in Lisp you could write it, but Lisp programmers don't depend on or talk about currying as much as Haskell programmers do.
    • mrbluecoat 33 minutes ago
      At least "the dead C" was a nice pun :D
      • molteanu 14 minutes ago
        I find it is a real challenge to come up with a good title. On the one hand it should, probably, convey to the potential reader something about the contents of the article, on the other hand it should be something to differentiate it from the rest of the articles published on the same subject.

        I like those that read something like a punch-line, that come across as something different that just a summary of the article. But these maybe work best for literature, prose, movies, etc.

    • tmtvl 2 hours ago
      The core point, to me, seemed to be about limiting factors in language extension. To allow something like:

        my_if (points <= 100, printf ("%D", points), error ("Invalid point total"));
      
      Where the various parameters are lazily evaluated. Or like:

        frobnicate (frazzle: foo, frozzle: bar, frizzle: baz);
      
      Where frazzle, frozzle, and frizzle are position-independent keyword variables.

      Allowing those in C would require a modicum of effort, while other languages make these kinds of syntax extension fairly easy.

      • PaulHoule 48 minutes ago
        In languages like Java (or C) you can build S-expression like structures like so

           Variable<Integer> x = newVariable();
           Expression<Integer> = add(x,literal(5));
           x.set(15);
           System.out.println(eval(x))  // prints "20"
        
        and it is not that hard to either serialize these to code or run them in a tree-walking interpreter where quote() and eval() imply an extended language where you can write functions that work on Expression<Expression<X>>. Type erasure causes some problems in Java that make you sometimes write a type you shouldn't have to and you do have to unerase types in method names which is a little ugly but it works.

        I did some experiments towards this to convince myself it would work

        https://github.com/paulhoule/ferocity/blob/main/ferocity0/sr...

        had I really kept at it I would have bootstrapped by developing a ferocity0 which was sufficient to write a code generator that could generate stubs for the Java stdlib + a persistent collections library and then write a ferocity1 in ferocity0, and if necessary ferocity(N+1) in ferocityN until it supported "all" of Java, though "all" might have omitted some features like "var" that are both sugar and use type inference that ferocity would struggle with -- if you need sugar in this system you implement it with metaprogramming.

        The idea is that certain projects would benefit from balls-to-the-walls metaprogramming and the code compression you get would compensate for the code getting puffed up. My guess is a lot of people would see it as an unholy mating of the worst of Java and Common Lisp. However, I'm certain it would be good for writing code generators.

        • qsort 17 minutes ago
          I have done something exactly like this in production for a system that turned natural language into SQL. This was pre-LLM, so we had models that produced intent and keywords as structured output and we had to turn it into queries for several backends. The project didn't work out for a variety of reasons, but technically it was beautiful: it produced query plans that in many cases were identical to those from the queries analysts wrote by hand. So yeah, I accidentally wrote a compiler. Does it still count?
        • molteanu 34 minutes ago
          The solution, which I often seen in practice, is to eventually write code generators, which is what Lisp macros are, after all. I've seen it in C and wrote a big piece about it that was posted here some time ago[1], about the extra tools, code generators, special formats and standards employed and needed to make up for C's deficiencies (in respect to meta-programming, at least).

          Everywhere I see code generators, that's a feature lacking in the main language used for the project. Then you bring in other tools to make up for that deficiency. Only, usually, we don't call that deficiency, since we are used to things being that way. It is called day-to-day business. I think that's what I've tried to convey in the article.

          [1] https://news.ycombinator.com/item?id=41066544