Top
Best
New

Posted by ingve 13 hours ago

Gleam doesn't compile to Erlang source anymore(gleam.run)
276 points | 115 comments
0x69420 10 hours ago|
to those curious, erlang abstract form[1] is the AST representation used by the erlang compiler/etc. per [1], you can see that it's canonically made of erlang terms, and you have easy access to routines for manipulating this representation from the standard library; it's really comfy when you need it! it's also the target elixir compiles down to, and the representation manipulated by parse transforms, which in base erlang are the way syntactic sugar (notably qlc[2] and some of the more cutesy pattern matches in merl[3] (which, in turn, manipulates the very same representation to do its job. very meta!)) is done.

most BEAM languages actually settle on erlang abstract format. you'd think core erlang would be more common since it feels more like a traditional functional IR, but basically only LFE does this, because it's a moving target without any particular stability guarantees from release to release.

1: https://www.erlang.org/doc/apps/stdlib/erl_parse.html#t:abst...

2: https://www.erlang.org/doc/apps/stdlib/qlc.html#q/2

3: https://www.erlang.org/doc/apps/syntax_tools/merl.html

lpil 4 hours ago|
LFE used to compile to core Erlang, but it now also compiles to abstract forms.

https://github.com/lfe/lfe/blob/387d0aa1092bdda0ca17481869e8...

https://github.com/lfe/lfe/blob/387d0aa1092bdda0ca17481869e8...

tmountain 15 minutes ago||
I love this language, but I have to wonder how much harder it is to grow a niche language these days when everyone is just telling Claude what to build for them. It seems like LLM friendliness is going to become the new benchmark for adoption if it hasn't already, and I find that pretty sad.
okkdev 5 minutes ago|
You know what they say, Gleam is a dream :)
giancarlostoro 7 hours ago||
Erlang is one of those runtimes I've loved since learning about it all the way back in 2008, but I never took time to learn the syntax, but Elixir and Gleam have had me fiddling with the Erlang VM over the years. Happy to see Gleam growing into maturity.
ryan-duve 5 hours ago||
I just learned Erlang this year and I love the syntax. Ending expressions with periods took getting used to, but capital first letters distinguishing variables, non-rebindable variables, semicolons between function clauses, a lack of boilerplate (defmodule et al), a fraction of end keywords, commas separating expression, ... all make for a very fun to use and ergonomic language, IMO.

I haven't tried Gleam yet, though. I'm interested in the focus on simplicity but a little wary because I understand they sacrificed niceties to minimize the language footprint, e.g., pattern matching in function heads. I intend to give it a shot the next time I'm greenfielding something.

mahboi 2 hours ago|||
Erlang is my favorite functional language out of all the ones I've tried. The matchers, guards, etc are all done very well. But I don't like functional. I used to think it was cool, gave it a real chance using Erlang for years, and eventually decided it's not a good fit for many use cases. Like at some point the neatness of doing all loops as recursion wears off and it's just tiring. It's not like CS algo homework, and even there you often want DP/memoization.

Edit: pure* functional

sodapopcan 1 hour ago||
> Like at some point the neatness of doing all loops as recursion wears off and it's just tiring.

Odd, but I believe you, lol. Elixir's list comprehensions take a `:reduce` option which makes accumulating values a bit more "familiar" and I often use over `reduce`:

    for a <- list, reduce: []
      acc ->
        [a | acc]
    end
Not sure if there is something like that in Erlang (or Gleam for that matter).
mahboi 1 hour ago||
If you already have a list in Erlang, you can use map and the foldl/foldr reducers. But there's no general for-loop. You're expected to use tail recursion.

Also tbh, I don't like reduce either. I agree with that article posted on HN a while back about devs not liking reduce. Just want to insert into my list or whatever.

SoftTalker 3 hours ago||||
I'm the same. I thought I was an oddball because so many people seemed to prefer Elixir but I like Erlang and its syntax. I wish I had more chances to use it at work but so far it's just been for hobby projects or playing with.
macintux 2 hours ago|||
I was fortunate enough to use Erlang professionally for a couple of years. I agree: the syntax is quite comfortable.
ch4s3 7 hours ago||
I'd say if you know and like Rust, then Gleam should be easy to pick up but otherwise I'd try Elixir. You can learn most of the language in a few days and be experimenting with BEAM and supervision concepts basically on day one. As a learning exercise I think its worth peoples' time because actors/processes are one of the concurrency models you don't see everywhere but solve interesting problems well.
lpil 6 hours ago||
I don't think that's the case, Rust and Gleam have almost nothing in common beyond having static type systems, and those type systems are very different too.

https://gleam.run/frequently-asked-questions/#How-does-Gleam...

ch4s3 6 hours ago|||
You don't think that Gleam has more familiar syntax to a Rust dev than Elixir? Or that the type system might feel more familiar?
lpil 6 hours ago||
I think a Rust programmer is more likely to prefer Gleam to Elixir, but I don't think there is much link between Gleam and Rust, and I especially do not thing that Gleam should only be considered over Elixir if you are already a Rust programmer.
ch4s3 6 hours ago|||
So I said:

> I'd say if you know and like Rust, then Gleam should be easy to pick up

And you think that:

> a Rust programmer is more likely to prefer Gleam to Elixir

Are we maybe splitting hairs here?

trenchgun 6 hours ago|||
You said: >I'd say if you know and like Rust, then Gleam should be easy to pick up but otherwise I'd try Elixir.

This is way too strong and narrow statement. Gleam is statically typed garbage collected language, closer to OCaml than Rust. Elixir if you like dynamically typed instead.

benzible 5 hours ago||
Obligatory comment that elixir is now gradually typed: https://news.ycombinator.com/item?id=48388324
tasuki 2 hours ago||
Tbh gradual typing sounds like a nightmare. Probably impossible to implement correctly, whatever your definition of "correctly".
josevalim 26 minutes ago||
Nah, the gradual angle is not what makes a type system tricky to implement. Plus we have published a few papers discussing how we are typing Elixir and how our approach is sound.
lpil 6 hours ago|||
It's very possible that I'm misunderstanding you! I'm mostly just saying that Gleam is very unlike Rust, so if you pick it or avoid it for Rust related reasons you may not be making the most informed decision.

The languages that Gleam is most like might be Standard ML, OCaml, Elm, and F#.

cweagans 5 hours ago|||
You seem to be interpreting the statements as technical comparisons of the languages, but ch4s3 was (by my read) commenting on the overall ability of a programmer to jump from one language to another.

That is: they aren't similar languages on a technical level, but if you know Rust, you should be able to make the jump to Gleam pretty quickly.

lpil 5 hours ago||
Aye, I am saying that jumping from Rust to Gleam isn't easy because the languages are so different. "How do I do X in Gleam like I would in Rust" is one of the most common categories of support question from newcomers who assumed they were similar.

It can take a moment to understand that things are done quite differently in the two languages due to being so different: https://gleam.run/frequently-asked-questions/#How-does-Gleam...

bmitc 5 hours ago|||
> The languages that Gleam is most like might be Standard ML, OCaml, Elm, and F#.

And guess which languages inspired several things in Rust.

lpil 5 hours ago||
The ML family clearly inspired Rust greatly, but the end result is very different.
innocentoldguy 46 minutes ago|||
I use Rust and prefer Elixir over Gleam because Elixir has Lisp-style macros (Gleam doesn't), uses OTP directly, has the fantastic IEx REPL (Gleam has no counterpart), and has Phoenix, the best web framework I've ever used.
lpil 42 minutes ago||
Yes, exactly my point! Being a Rust user doesn’t mean you are going to prefer or even understand Gleam.
bmitc 6 hours ago|||
> I'd say if you know and like Rust, then Gleam should be easy to pick up

I think by sentiments like this, people mean if you know unions, records, and pattern matching then you'll more easily pick up another language that has unions, records, and pattern matching.

ch4s3 6 hours ago||
Yep, that's essentially what I mean. There's even this official cheatsheet[1] that shows a lot of overlap.

[1] https://gleam.run/cheatsheets/gleam-for-rust-users/

lpil 39 minutes ago||
This shows only the base syntax and has nothing of the language functionality, so is incapable of showing overlap between the languages.
MichaelNolan 8 hours ago||
Gleam is such a beautiful language. I wish I had the opportunity to use it more. If it could compile (transpile) to a native target like rust or go, it would be truly perfect.
rapnie 6 hours ago||
I would love to see support for wasm and wasi.
whalesalad 8 hours ago|||
I am working on a language called blasphemy which intends to do this.
znpy 7 hours ago||
Looking forward to be able to claim to be “proficient in blasphemy” on my cv! /s
packetlost 7 hours ago|||
I feel like Go would be a great backend target for Gleam
lpil 7 hours ago|||
Go's garbage collection isn't well suited for an immutable language like Gleam, so the performance would likely be disappointing compared to other targets.
ch4s3 7 hours ago|||
The concurrency model in Go is also poorly suited to the BEAM's process model. Goroutines share a heap so you can't do a lot of things safely that processes can do. Having independent memory space for a process allows you to free it safely when work is done without GCing everything and you can also safely share data because you have a copy not a ref.
packetlost 6 hours ago|||
An JavaScripts is? Rust is probably a more performant target regardless
lpil 6 hours ago|||
Surprisingly yes! JavaScript's allocator and garbage collection system is quite well suited to immutable programming.

Rust is a very poor compile target as the compiler is slow and not commonly available, and the aspects of Rust that make it good for humans to write make it a poor choice for compilers to target. With humans the produced code is verified, but with a compiler the compiler is what is to be verified, so the inflexibility of Rust are largely a hindrance compared to other native compilation targets.

Imustaskforhelp 5 hours ago||
What lower-level language do you think aside from rust which can be more helpful for the purposes of being a compile target, nim/D both support garbage collection and non garbage collection, so would languages like these be more preferable

I really love gleam and its community and I would really really love if gleam could be more like golang though, which can help it in compiling to machine code

gleam language but with the developer experience of golang (cross portability/small binaries/fast compiled language which is fast to compile) is honestly one of my fever dreams and I would love to know if it can ever be a reality!

lpil 5 hours ago||
For that sort of compilation target more flexibility is beneficial, so C, Wasm, LLVM IR, Cranelift IR etc are better than Go, Nim, and D in my opinion.

> cross portability/small binaries/fast compiled language which is fast to compile

You don't need native compilation to build fast single file executables for a program, there's ways one can achieve this with Gleam today. Bundling the BEAM into your Gleam application executable with something like Gleepack is one option, and this will produce smaller executables than Go will by default for many applications.

__MatrixMan__ 6 hours ago|||
I don't get the impression that javascript is among Gleam's targets because of performance.

- server target: BEAM

- client target: js

Once you've covered those bases, you're kind of done.

If the server needs to do something special in an OS process... might as well let the OS mediate that interaction so that it can be fully generic, rather than trying to bend the language around whatever the unknown action might be.

phplovesong 5 hours ago|||
For that there is Lisette. Close to gleam, compiles to Go.
ninininino 15 minutes ago||
I just learned about Lisette, and from there Gala. Any thoughts on Lisette vs Gala?
phplovesong 5 hours ago|||
You just described Lisette. Its very close to gleam, and compiles to Go.
fggbbjnvh 8 hours ago||
[flagged]
zachrip 10 hours ago||
Shout out to Giacomo's twitch streams. He has taught me about some features of Gleam, Rust, and on top of that he's just a very chill person. He takes time away from his focus to answer questions politely and without judgement. There are dozens of programming streams where the streamer forgets to leave their ego at the door and he is not one of them. I highly recommend following it.
giacomocava 7 hours ago||
Thank you so much!! Reading this really made my day <3
oDot 3 hours ago||
Thank you for Squirrel as well!
olexsmir 6 hours ago|||
massive +1, been watching his streams from time to time, and the man is the definition of a humble and chill person
giacomocava 4 hours ago||
Aww thank youuu
oDot 3 hours ago|||
The Gleam community is generally very very nice. I maintain about 200k lines of Gleam[0][1], and they have generally accommodated even my stupidest posts on Discord.

The language itself is as welcoming. Even LLMs are less cranky and output nicer code, not having to deal with React.

[0]: https://blisswriter.app/

[1]: https://nestful.app/

speerer 10 hours ago|||
...And he animates his presentations by hand-drawing each frame transition, which speaks volumes.

[edit - this might have been ambiguous. I meant that it shows he really cares about the fine details.]

jxf 8 hours ago||
Do you have an example you especially like?
speerer 8 hours ago|||
Yes! https://discourse.ubuntu.com/t/gleam-and-the-value-of-small/...
irickt 7 hours ago||
Here's his presentations page: https://giacomocavalieri.me/speaking
dematz 8 hours ago|||
not from a presentation but he made this nice little syntax postcard https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:vzaxc2i...
cod1r 9 hours ago||
yea he is super nice.
giacomocava 4 hours ago||
Thank you! Too kind
jmcgough 22 minutes ago||
Louis is amazing. So cool to see how he's grown this project since starting it.
tiffanyh 5 hours ago||
The title is a bit misleading because one might imply that Gleam no longer compiles to something Erlang can use (not true).

From the article:

> Over the last few months Giacomo Cavalieri has entirely rewritten Gleam's Erlang code generator that has an entirely different design, and most notably, outputs a different format. Previously Gleam generated Erlang source code, now it generates Erlang abstract forms.

lpil 4 hours ago|
The title says it no longer compiles to Erlang source. That's true, it now compiles to an IR of the Erlang compiler.
olexsmir 6 hours ago||
I love seeing how gleam gets better and better with every release, sadly I dont have any projects where I could use gleam :(
__jonas 9 hours ago||
Pretty exciting change that I didn’t see coming —- I wonder if someone will end up implementing an integration with the Whatsapp Erlang debugger
lpil 8 hours ago|
The only thing that would be needed for this is for 2 flags to be passed to the Erlang compiler. It would be very trivial!
desireco42 35 minutes ago|
I will just say, as of recently, especially thanks to AI, I've been doing projects in Gleam, I am on third Gleam project and it has been very pleasant experience. It takes longer to write but it is much shorter, easier to follow and much more easier to update and change.
More comments...