logoalt Hacker News

Yannik_Sc • today at 8:54 AM • 2 replies • view on HN

While I generally like Lua this code just looks .. not so Lua - like, it definitely is Lua, but it could look much better by utilizing language features like "Parenthesis-free calls":

  ui.Button "Button Text" {
    on_click = function()
      print("Hello world")
    end,
    disabled = true
  }
or

  ui.VStack {
    padding = 31, -- Named key => option
    wrap = true,
  
    ui.Button "..." {}, -- Indexed by number => children
  }
feels more Lua and slightly cleaner imo

Replies

otikik • today at 9:11 AM

I had a similar impression. It feels "not idiomatic". I disagree on the diagostic though - I think parenthesis-free calls are not what define what idiomatic lua is.

To me it is more about expressiveness and usage of basic language features. For example here's how a text field is set up currently.

           ito.TextField(draft)
                :label("Name")
                :focused()
                :on_submit(function(value)
                    if value:match("%S") then
                        phase.value = "review"
                    end
                end)
                :on_cancel(function()
                    phase.value = "choose"
                end),

The field is created on the first line, and then altered further with subsequent method calls that alter it. This reads like someone very used to Rust (and its Builder pattern) and then translating it verbatim to Lua. A more native Lua interface for me would look like this:

           ito.TextField(draft, {
                label = "Name",
                focused = true,
                on_submit = function(value)
                    if value:match("%S") then
                        phase.value = "review"
                    end
                end,
                on_cancel = function()
                    phase.value = "choose"
                end),
           })
As in: just pass a table to the builder. And if they ned to modify it later, they can just do:

           some_textfield.on_cancel = <some other function>
No need to "guard" the internal table with those extra methods.
➕ show 1 reply
cat-whisperer • today at 9:23 AM

it does, but I am a fan of the composability that ratatui has, and I wanted to copy it over…