[HN Gopher] Sky - an Elm-inspired language that compiles to Go
___________________________________________________________________
Sky - an Elm-inspired language that compiles to Go
Author : whalesalad
Score : 116 points
Date : 2026-04-06 15:22 UTC (7 hours ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| zem wrote:
| at first glance this looks amazing! basically provides everything
| I have ever wanted in a full stack language. looking forward to
| experimenting with it.
|
| edit: looking through the docs/examples some more, it looks like
| javascript interop is fairly clunky, both because it relies on
| string concatenation to embed fragments of javascript, and
| because the string concatenation syntax is not great (and the
| formatter makes it even worse - see the example at
| https://github.com/anzellai/sky/blob/main/examples/13-skysho...)
|
| I would encourage you to at the least add multiline strings with
| interpolation support, and ideally add a small compiler for html
| literals.
| riclib wrote:
| Can't wait to play with it. Great design!
| skybrian wrote:
| Functional languages have some good and some bad features and
| there's no reason to copy them all. For example, you don't need
| to have a Hindley-Milner type system (bidirectional is better) or
| currying just because it's a functional language.
| troupo wrote:
| We need more _pragmatic_ languages. E.g. Erlang and Elixir are
| functional, but eschew all the things FP purists advocate for
| (complex type systems, purity, currying by default etc.)
| zem wrote:
| ocaml has a complex type system but it's also very pragmatic
| in that it doesn't force you into any one paradigm, you can
| do whatever works best in a given situation. (scala arguably
| goes further in the "do whatever you want" direction but it
| also dials the complexity way up)
| troupo wrote:
| Yes! Completely forgot about OCaml because I only spent a
| couple of months with it
| rapind wrote:
| If you like Erlang, Elixir, and Elm/Haskell, then Gleam +
| Lustre (which is TEA) is a pretty great fit.
| melodyogonna wrote:
| That's two new languages compiling to Go making HN frontpage in
| as many days. It seems people like everything about Go except the
| language itself. Me? I like everything about Go including the
| language, these transpiled languages are interesting though.
|
| But I keep wondering if they could integrate at a lower-level
| than the source code. Like how JVM languages integrate at the
| bytecode level, or LLVM languages at the LLVM level
| MichaelNolan wrote:
| > But I keep wondering if they could integrate at a lower-level
| than the source code.
|
| I'm sure they could, but targeting go source code has the
| benefit of giving early adopters an escape hatch. If it
| targeted LLVM directly, I would never consider using this at
| work since the risk of it being abandoned is too high. But
| since it targets go source, I would perhaps consider it for
| some low importance projects at work.
| seabrookmx wrote:
| The standard go toolchain doesn't use LLVM. Go has its own
| assembly format and machine code generation.
| ksec wrote:
| If we think of Go as different kind of C, then having Go as a
| compiled target seems to make sense as C is a compiled target.
| onlyrealcuzzo wrote:
| What was the other one?
|
| I'm working on a language that transpiles to Zig with a custom
| Go-like runtime (and no garbage collector, Rust-style Affine
| movement instead).
|
| Sky seems quite cool, as it's additive to Go in interesting
| ways.
|
| I originally considered keeping the GC and just transpiling to
| Go so I didn't need to write a Runtime.
|
| Go rules! It really does. But I _HATE_ writing /reading Go.
|
| So I'm glad more people are doing this!
| styluss wrote:
| https://lisette.run/
| onlyrealcuzzo wrote:
| Awesome, this is _very_ close to what I originally
| considered.
| nu11ptr wrote:
| > But I keep wondering if they could integrate at a lower-level
| than the source code.
|
| Unfortunately nothing below source code level is stable, so
| they would constantly be chasing changes after any Go release.
| I personally wish they would focus on making it accessible, as
| Go actually has a nice runtime and would make a good language
| target.
| tasuki wrote:
| A bit too bleeding edge for me, but it does look super nice (ie
| exactly like Elm).
| redoh wrote:
| Elm's type system and architecture are genuinely pleasant to work
| with, so seeing those ideas ported to a Go compilation target is
| interesting. You get the safety and expressiveness of Elm but end
| up with a Go binary you can deploy anywhere. I wonder how the
| error messages compare, since that was always one of Elm's
| strongest features.
| submain wrote:
| Great work :). Go doesn't have TCO. That means functional
| languages (no for loops) could blow up the stack. How did you
| solve that?
| kubb wrote:
| You can just compile any tail recursive function to a function
| with a loop and no recursion.
| 1-more wrote:
| This is in fact how Elm does it! Tail call recursion compiles
| to a while loop.
| srean wrote:
| That does not address the use case where I find tail
| recursion most tempting. That would be mutually recursive
| functions.
|
| If the function can be written as an idiomatic loop I
| probably would do so in the first place.
| 1-more wrote:
| I will add this to my list of Elm-inspired tools that call to
| mind Brian Eno's quip about the first Velvet Underground album:
| "I think everyone who bought one of those 30,000 copies started a
| band!" With Elm it feels like it's 1% of Elm users creating a
| language.
|
| https://quoteinvestigator.com/2016/03/01/velvet/
| onlyrealcuzzo wrote:
| First - awesome job. Congrats. Self hosting is an accomplishment!
|
| But I'm curious to get your thoughts on the process in hindsight.
|
| I understand why it's valuable: to cast a wide net in catching
| bugs and give a good signal that your language is generally
| "ready".
|
| I'm working on a similar language, but worried about going down
| the self-hosting path, as I think it'd slow me down rather than
| speed me up.
|
| How did it work for you?
| ModernMech wrote:
| What's the actual accomplishment here? It seems like the
| language came into existence a month ago and was written mostly
| by Claude. If self hosting is a matter of asking Claude to do
| it and it takes a couple weeks, is it really an accomplishment
| at all?
| troosevelt wrote:
| Yes, somebody has to actually do it, and they did.
| onlyrealcuzzo wrote:
| Anything + Go's runtime is a reasonable language.
|
| Go's runtime is one of the greatest pieces of software ever
| built.
|
| Assuming this works - which self-hosting guarantees a
| _minimum_ level of "working" - this is useful!
|
| I didn't want to rely on the unpredictability of a garbage
| collector, so I chose to build my own runtime, but it's not
| going to be as good as Go any time soon.
| harikb wrote:
| Somewhat unrelated to the language itself:
|
| > The compiler bootstraps through 3+ generations of self-
| compilation.
|
| I guess it applies to any language compiler, but f you are self-
| hosting, you will naturally release binary packages. Please make
| sure you have enough support behind the project to setup secure
| build pipeline. As a user, we will never be able to see something
| even one nesting-level up.
| mrichman wrote:
| Compiles to Go or transpiles to Go?
| farfatched wrote:
| Either is fine.
|
| ``Formally speaking, "Transpiler" is a useless word''
|
| https://people.csail.mit.edu/rachit/post/transpiler-formal/
| 9rx wrote:
| You are free to use whatever word you want. Even "bloopydoopy",
| if you so wish. But "compiles" is best.
| __natty__ wrote:
| I would love to see Java inspired language compiled to Go. I
| really like Go portability and standard library and Java...
| verbosity. I prefer explicit names, types and all the syntax
| around that. Graalvm is not an answer for me because as far as
| I'm aware it doesn't support cross-compile.
| weavie wrote:
| You could make it happen in about a week and $50 worth of
| tokens.
| ch4s3 wrote:
| If you allow FFI are you really inspired by Elm? ;)
| librasteve wrote:
| Very cool.
|
| I am comparing this https://github.com/anzellai/sky#tea-
| architecture with this https://harcstack.org (my thing) ... guess
| I have some work to do ;-)
| taolson wrote:
| Nice to see another language with Haskell / Miranda type syntax,
| but the vibe-coded implementation sure shows: e.g.
| src/Compiler/Infer.sky isUpperStart:
| isUpperStart : String -> Bool isUpperStart name =
| case String.slice 0 1 name of
| "A" -> True
| "B" -> True
| "C" -> True ... for 23 more
| cases.
|
| And the corresponding go code in the bootstrap compiler is even
| worse.
| toastal wrote:
| Haskell/Miranda use `::` instead of `:` for type signatures
| unlike Elm & basically the rest of the family which prioritize
| types being less keypresses than list cons.
| taolson wrote:
| Sorry, I meant "Haskell / Miranda _style_ syntax " -- e.g.
| curried functions, concise syntax with little boilerplate,
| etc. The word _type_ is too overloaded ;-)
___________________________________________________________________
(page generated 2026-04-06 23:00 UTC)