Yet another way to invoke functions without parentheses

(blog.ikaes.de)

157 points | by aragonite 2 days ago

9 comments

  • hans_castorp 3 hours ago
    This reminds me of "Creators admit Unix, C hoax" (e.g. https://www.gnu.org/fun/jokes/unix-hoax.html)

    > We stopped when we got a clean compile on the following syntax:

        for(;P("\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
    • nathell 2 hours ago
      How Perl was created:

      ‘Larry, throw the cat at the keyboard!’

      MEEEOW!

      ‘What did it type?’

      ‘&}Ak'>v=4%Qe}9;’

      ‘OK, so let’s make this a syntax for hello world.’

      • bjoli 1 hour ago
        There was a hilarious video in The early days of YouTube when someone tried to write Perl using vistas voice recognition.

        I haven't seen it in many many years, but at the time it struck my giggle button every time.

      • saghm 1 hour ago
      • nullsanity 1 hour ago
        I did genuinely try to run this since, well, it could be true, I don't know Perl.

        Bareword found where operator expected (Missing operator before "Ak"?) at -e line 1, near "&}Ak" Bad name after Ak' at -e line 1.

  • amelius 1 hour ago
    I want to put the called function after the arguments:

        (((x)f)g)h
    
    So I can see exactly the order in which things happen, from left to right. As opposed to:

        f(g(h(x)))
    
    where I have to read backwards.
    • ashkankiani 6 minutes ago
      Stack based languages and the APL tradition all follow this pattern, which I agree can be more terse and nice too. I've also been experimenting with right-associative calls which does the same thing but in reverse. For a data pipeline you're more likely to transform from A->B, so I think the post-fix syntax makes sense.

      But you can also define a "thread" operator easily for doing subsequent function calls. ala `threaded x { f; g; h }`

    • danlitt 1 hour ago
      Do you mean (((x)h)g)f ?

      since the order in which things happen is "h first, then g, then f"

    • ktpsns 58 minutes ago
      Mathematica has a crazy amount of syntax abbreviations (https://reference.wolfram.com/language/guide/Syntax.html). Of course your whish is fulfilled there: x // f called the postfix operator.
    • adverbly 26 minutes ago
      That actually makes so much sense...

      When you're calling a function, you're putting some things into the function... You have to get the things first before you can put them in...

      Why didn't it evolve like that in the first place? Is it a byproduct of mathematical notation? If so, I wonder why mathematical notation evolved that way in the first place...

      • baruchel 12 minutes ago
        Forth (or Postscript by the way) works exactly like that, but writing the function first also makes sense in functional programming, specifically when you care about currying functions: writing "f(g(h(x)))" (or "f g h x" or whetever) makes more sense, since you are not supposed to put all expected arguments at once.
      • stronglikedan 15 minutes ago
        > Why didn't it evolve like that in the first place?

        It did, just in Arabic.

    • nine_k 34 minutes ago
      Did you even have an RPN-based calculator at school?

      As to more serious programming languages, Erlang, F#, Haskell have forms of a "pipe" operator, roughly

        [1 2 3] |> sum |> print
      
      For it to work properly, functions should be either functions of one argument, or support currying.

      But the original algebra functions, as introduced by Leibniz in 17th century, were, of course, pure functions, more like properties than procedures. So cos(x), aka cos x, is just a formalized shorthand for "cosine of x", so it preserved the order of words typical for Germanic and Romance languages. Maybe if functions were introduced by the Japanese, we would have the reverse order, kind of x の cos.

    • Rohansi 44 minutes ago
      The function reference is actually evaluated first so your preferred order is actually backwards! Consider this:

        foo.bar(x)
      
      The `foo.bar` field has to be retrieved before the function can be called. It does not evaluate `x` first. That is observable with JS proxies, or you can test with code like this:

        foo()(bar())
      • LtWorf 0 minutes ago
        Executing the "." operator isn't the same as executing the function.
    • account42 49 minutes ago
      This is why some languages have the | pipe syntax for chaining operations.
    • layer8 52 minutes ago
      If `f` is an expression, that would require it to be evaluated last as well.
    • raverbashing 35 minutes ago
      And that's why "purely procedural" languages don't make much sense to me

      It's more natural to write

          x.h().g().f()
    • psychoslave 44 minutes ago
      [flagged]
  • nathell 2 hours ago
    I love this. This is a fun hack, but the article also hearkens back to pre-LLM days when people were still interested in _code_.
    • bunderbunder 1 hour ago
      I wonder if there was a period in the 90s where the chess community was more interested in talking about IBM’s stock price than in actually playing chess.
    • stymaar 1 hour ago
      I'm definitely gonna use that for April 1st though, just adding this as instruction in Claude.md

      That will also serves as a litmus test to check how many of my coworkers are reading the code they push.

    • stigok 2 hours ago
      Programmers are still interested in code
      • cm2187 2 hours ago
        Weekend hobby!
        • mystifyingpoi 2 hours ago
          Now there is Monday again, no more coding, back to babysitting agents.
    • idkfoekfkdcjjs 52 minutes ago
      Ah yeah, here we go…

      “Back in my days…”

      “No true Scotsman…”

      “I remember when…”

      “Kids these days…”

      Gotta love this self-aggrandising humble-brag nonsensical stuff.

  • CrendKing 2 hours ago
    Not gonna work on Firefox, since according to the doc, Error.prepareStackTrace is an optional API and only implemented by V8.
    • fg137 2 hours ago
      > optional API and only implemented by V8

      aka "Chrome implemented this and wanted everyone else to do so as well"

  • pards 3 hours ago
    Off topic: This website looks like a ransom note
    • eviks 1 hour ago
      Maybe it is, just requires a different parser
  • TheSilva 3 hours ago

      Object.prototype.message='alert\x281337\x29';Array.prototype.toString=Error.prototype.toString;Error.prepareStackTrace = Function;const x = new Error;x.valueOf=x.stack;+x;
    
    Well, that's a mouthful! So many years and JavaScript still can do the most amazing, weird, awesome, scary, obscure, and sexy things in the world of coding.
    • fg137 1 hour ago
      The prototype thing is quite unique among mainstream languages. It is kind of simple in principle and works well for what it intends to do, but god it causes so much confusion and is frequently a source of CVEs. valueOf combined with implicit conversion is a nightmare for production code.
    • customguy 2 hours ago
      Yesterday I was re-using some shaders I had written a long time ago, and here's what I used to do multiline strings before the glorious backtick arrived on the scene...

          (function () {/*
            my awesome shader code
          */}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1]
      
      ... I can't call it sexy, but I also can't deny I felt a mixture of fear and arousal when I saw that.
      • annex-winged-cr 1 hour ago
        TIL about [^], never seen that before. Apparently, it works like a dot but it also matches newlines.
        • chii 2 minutes ago
          I believe this is the regular syntax for a set of characters (between "[" and "]"), but the caret symbol ("^") is negation when used inside the set. Therefore, it is simply the negation of an empty set of characters.
        • gmac 1 hour ago
          Oh, me too. I’ve previously used [\s\S] for that.
      • h43z 1 hour ago
        Pretty interesting that you can carry comments over.

            (x=>/*this is a comment*/1) + 1
            "x=>/*this is a comment*/11"
        
        I wonder if anything cool can be done with it today. It's probably useless.
  • semiquaver 3 hours ago
    JavaScript is so cursed.
    • user____name 2 hours ago
      If I were to write a book on programming in JS, it would be a black cover with the JS Holy Trinity equality diagram in red, to emphasize its Satanic nature.
      • toolslive 37 minutes ago
        Satanic? never assume malice where incompetence suffices
  • aktenlage 3 hours ago
    What's the purpose of the +x at the end?
    • undecidabot 3 hours ago
      The unary plus implicitly converts an expression to a number, which calls `valueOf` for non-primitive values.
    • emaro 3 hours ago
      I think to implicitly trigger the valueOf function.
  • CoalitionOfPity 3 hours ago
    [flagged]
    • user____name 2 hours ago
      GPT also thinks Frankenstein and Moby Dick are 100% AI last time I checked.
    • nathell 2 hours ago
      Doesn’t feel LLM-y to me. If it is LLM-generated, the LLM must have been explicitly instructed to ignore sentence capitalization and invent a persona (‘i chose...’).
    • nmstoker 3 hours ago
      Aha, that's a great reassurance then! ;-)
    • LatencyKills 3 hours ago
      The irony of using AI to determine if something was written by AI.
      • happytoexplain 2 hours ago
        Ironic in a good way, you mean? Like employing a counterfeiter to help identify counterfeits?

        Regardless, I don't think it's correct on this one.

        • LatencyKills 2 hours ago
          I'm not pro-AI (at least not the way the SOTA model companies operate) but I'm tired of seeing "written by AI" on every single thing on HN.

          I get "wRiTteN bY aI!" comments on my open source projects when, in fact, I didn't use AI at all. I've considered sharing some of my recent reverse engineering work on HN but am confident that it would devolve into "it must have been written by AI" bs.

          Is it important to know if something was created with AI? Yes. But spewing "written by AI!" without reading/evaluating something yourself is just as lazy.

          The new generation of engineers will never know a world where all software was written by humans. As someone who spent 22 years writing assembly and low-level C/C++, I think that's a shame. But that is the new reality.

          • idkfoekfkdcjjs 44 minutes ago
            > The new generation of engineers will never know a world where all software was written by humans.

            You never knew this world either.

            > As someone who… [humble-brag followed by depressingly fake empathetic message]

            Please. Get off the high horse. “As someone who…” is just “trust me bro” coupled with ego-stroking nonsense. It is not an argument and gives you absolutely zero authority over what you are talking about.

      • mpweiher 3 hours ago
        'tsAll Goodman.
    • fzzzy 2 hours ago
      And it's wrong
    • brazukadev 2 hours ago
      Congratulations, you made a great thread worse.