HackerTrans
TopNewTrendsCommentsPastAskShowJobs

whichdan

1,259 karmajoined il y a 15 ans
(They/Them) Director of Engineering in Boston

comments

whichdan
·il y a 5 jours·discuss
I agree that the stability is quite nice. But there are plenty of areas where the language could use some improvement - for instance, the ergonomics around writing nested Single Page Apps is pretty cumbersome.
whichdan
·il y a 5 jours·discuss
There's a lot to love about Elm, and I've written quite a bit of production code with it starting around 0.18.0. But in 2026 I'm not sure why a company would newly choose a language that hasn't otherwise been updated in nearly 7 years.
whichdan
·il y a 2 mois·discuss
Honestly the feedback loop of "do math to roll more" would make this an excellent game for kids IMO
whichdan
·il y a 2 mois·discuss
Yeah I agree. I grew up in a very blue-collar town, and anything I wanted to learn (outside of public schooling) either came from emaciated websites or whatever books I could find at the library. Having YouTube and Khan Academy and everything else would have made such a huge difference for me.
whichdan
·il y a 9 mois·discuss
The nice thing with the Elixir example is that you can easily `tap()` to inspect how the data looks at any point in the pipeline. You can also easily insert steps into the pipeline, or reuse pipeline steps. And due to the way modules are usually organized, it would more realistically read like this, if we were in a BulkEmails module:

  Users.all()
  |> Enum.filter(&Users.is_expired?(&1, Date.utc_today()))
  |> Enum.map(&generate_expiry_email/1)
  |> tap(&IO.inspect(label: "Expiry Email"))
  |> Enum.reject(&is_nil/1)
  |> bulk_send()
The nice thing here is that we can easily log to the console, and also filter out nil expiry emails. In production code, `generate_expiry_email/1` would likely return a Result (a tuple of `{:ok, email}` or `{:error, reason}`), so we could complicate this a bit further and collect the errors to send to a logger, or to update some flag in the db.

It just becomes so easy to incrementally add functionality here.

---

Quick syntax reference for anyone reading:

- Pipelines apply the previous result as the first argument of the next function

- The `/1` after a function name indicates the arity, since Elixir supports multiple dispatch

- `&fun/1` expands to `fn arg -> fun(arg) end`

- `&fun(&1, "something")` expands to `fn arg -> fun(arg, "something") end`
whichdan
·il y a 10 mois·discuss
I wonder if the thinner profile will make it more comfortable in smaller hands (both in terms of reach and center-of-gravity), but I'm skeptical.