A perfectable programming language
119 points
11 hours ago
| 16 comments
| alok.github.io
| HN
kleiba2
59 minutes ago
[-]
> because it's perfectable. it's not perfect, but it is perfectable. you can write down properties about Lean, in Lean.

Homoiconicity anyone? Lisp is one of the oldest high-level programming languages, and it's still around.

reply
unexpectedtrap
6 hours ago
[-]
Unfortunately Lean’s distribution went from somewhat about 15 MiB in times of Lean 3 to more than 2,5 GiB when unpacked nowadays for no good reason. This is too much. Even v4.0.0-m1 was a 90 MB archive. Looks like that Lean’s authors do not care about this anymore.

Lean 3 was the least bloated theorem prover among Lean, Coq and Agda, and Lean 4 is the most bloated among this Big Three. This is very sad.

Personally, I stopped using Lean after the last update broke unification in a strange way again.

reply
c0balt
4 hours ago
[-]
Lean is far off the most bloated one. Isabelle most likely takes that spot, the main archive includes a whole vscodium among other things.
reply
solomonb
6 hours ago
[-]
i love lean4, best in class functional programming language. but i think its "perfectability" is kinda hamstrung by baking non-constructive axioms into the standard library. the kernel has to treat these as opaque constants that cannot be reduced.

i tend to stick with agda for doing mathy programming. i kinda want lean4 to replace haskell at some point in the future as the workhorse production typed fp language.

reply
dharmatech
3 hours ago
[-]
I've been messing around with a computer algebra simplifier in Lean:

https://github.com/dharmatech/symbolism.lean

Lean is astonishingly expressive.

reply
travisgriggs
6 hours ago
[-]
Fortran, Basic, APL, Beta, Odin, Self, C, C++, Objective-C, C#, C--, D, Scheme, Clojure, F-Script, Eiffel, COBOL, Ocaml, Haskell, Snobol, Crystal, Forth, Python, Lisp, Brainfuck, Java, Oak, Javascript, TypeScript, Wasm, Logo, Elang, Elixir, Gleam, Elm, Zig, m4, Tcl, Simula, Smalltalk

Fun challenge. Unlike the author, I have nothing really to add.

I just wanted to say that "I did NOT write it with ..."

reply
riffraff
2 hours ago
[-]
Indeed! I got to about 20 with A-B-C but it somehow became harder after those. The multitude of C-something is obvious but I didn't realize there's so many A* languages (apl, ada, agda, alice, algol, applescript, apex, ampl, assembly..)
reply
psychoslave
4 hours ago
[-]
Are they actual project running some business in the wild? I only played with coq in university, while I saw F# being employed in insurance companies. I only heard about lean through HN posts.
reply
c0balt
4 hours ago
[-]
I don't know about running per se but practical applications (as in done for product/service) exist. A notable practitioner for Isabelle and Lean is AWS[0]. There is also TLA+ for a more practical tool.

The most widely used variant of these proof assistants are probably formally verified compilers, like compcert, which are used in some highly regulated industries like aviation.

[0]: https://isabelle.systems/zulip-archive/stream/247541-Mirror.... and https://lean-lang.org/ (Cedar)

reply
zem
8 hours ago
[-]
this is the log post that put lean on my radar, though I haven't played with it yet: https://kirancodes.me/posts/log-ocaml-to-lean.html
reply
snthpy
1 hour ago
[-]
Great post. Thanks!
reply
snthpy
2 hours ago
[-]
Very nice!

I've been wanting to adopt Lean for a project but wasn't sure about the speed. Nice to hear that it should be good on that front.

reply
ilsubyeega
9 hours ago
[-]
i like this website, it shows documentation when hovering the code while i see similar stuffs really rare in web blog areas
reply
md224
8 hours ago
[-]
I believe you can thank Verso for that:

https://github.com/leanprover/verso

reply
xarope
5 hours ago
[-]
interesting the ones they chose to name; I would have probably started with 6502/68000/68020/z80 assembly, fortran, cobol, basic, c, ada, simula 67, sh, zsh, bash, napier 88, tcl, perl, rexx, before hitting the next generation of python, c++, etc.
reply
shevy-java
2 hours ago
[-]
> languages without types tend to grow them, like PHP in 7.4 and Python type annotations

Well ... that is a trend that is driven largely by people who love types.

Not everyone shares that opinion. See ruby.

It is very hard to try to argue with people who love types. They will always focus on "types are great, every language must have them". They, in general, do not acknowledge trade-offs when it comes to type systems.

So the claim "tend to grow them" ... it is not completely wrong, but it also does not fully capture an independent want to add them. It comes ALWAYS from people who WANT types. I saw this happen "live" in ruby; I am certain this happened in python too.

> inevitably, people want to push types. even Go. C++ templates are the ultimate example. if it can be computed at compile time, at some point someone wants to, like Rust's ongoing constification.

And many people hate C++ templates. But comparing that language to e. g. ruby is already a losing argument. Languages are different. So are the trade-offs.

> dependent types can get you there. hence perfectable.

So the whole point about claiming a language is "perfectable", means to have types? I don't agree with that definition at all.

> most languages have no facility for this,

How about lisp?

> this lets you design APIs in layers and hide them behind syntax.

The language already failed hard syntax-wise. This is a problem I see in many languages - 99% of the language designers don't think syntax is important. Syntax is not the most important thing in the world, but to neglect it also shows a lack of understanding why syntax ALSO matters. But you can not talk about that really - I am 100% certain alok would disagree. How many people use a language also matters a LOT - you get a lot more momentum when there are tons of people using a language, as opposed to the global 3 or 4 using "lean".

reply
ChadNauseam
2 hours ago
[-]
> So the claim "tend to grow them" ... it is not completely wrong, but it also does not fully capture an independent want to add them. It comes ALWAYS from people who WANT types.

Who else would add them, besides people who want them? I'm confused about what you're even claiming here. It sounds like you feel that there's a vocal minority of type enthusiasts who everyone else is just humoring by letting them bolt on their type systems.

reply
andersmurphy
1 hour ago
[-]
> How about lisp?

I was wondering why lisp (and forth) were omitted from the initial list of languages named in the post.

I guess Scheme is in the list has ok macros.

reply
mastermage
1 hour ago
[-]
Well Ruby kinda brought forth Crystal which while its own Programming Language is kinda Ruby but with Types.
reply
whacked_new
6 hours ago
[-]
wait, I'm intrigued, it says the blog itself is lean code. How? It's rendered, like pollen?
reply
ajs1998
4 hours ago
[-]
It is verso. My understanding is that it's like really fancy javadocs that makes communicating Lean code easier for everyone.

https://github.com/leanprover/verso

reply
IshKebab
1 hour ago
[-]
The thing I found really surprising about Lean is that although it is really focused on proving stuff, it has some surprisingly enormous footguns. What do you think the result of these are?

  #eval (UInt8.ofNat 256 : UInt8)
  #eval (4 - 5 : Nat)
The first should be a compile time error right, because `UInt8.ofNat` is going to require that its argument is 0-255. And the second should be a compile time error because subtraction should not give a `Nat` unless the first argument is definitely more than the second.

Nope! Both give 0.

reply
unexpectedtrap
10 minutes ago
[-]
Who said that it should be a compile time error? That’s just a convention, and this is definitely not a bad one. No one is going to like the need to pass each time a proof that `a ≥ b` for every `a - b` invocation. Taking into account that this proof will most likely be an implicit argument, that would be a really annoying thing to use.

On the other hand, array indices by default do require such a proof, i.e., this code produces a compile time error:

  def x := #[1, 2, 3, 4]
  #check x[7]
Kevin Buzzard even wrote a blog post about a similar question about division by zero: https://xenaproject.wordpress.com/2020/07/05/division-by-zer...
reply
heliumtera
6 hours ago
[-]
>The recommended way to install Lean is through VS Code and the Lean 4 VS Code extension,

Lol

reply
jinwoo68
5 hours ago
[-]
There are community-built editor supports. For example,

- Emacs: https://github.com/leanprover-community/lean4-mode

- Neovim: https://github.com/Julian/lean.nvim

I'm using the Emacs lean4-mode and it's pretty good.

reply
adamnemecek
5 hours ago
[-]
It makes complete sense to polish that usecase.
reply
spankalee
9 hours ago
[-]
What is up with so many people doing weird capitalization now? Is this some Bay-tech flex? Alok writes their own name, and other names, with leading caps, but not the first word in sentences? It makes it so uncomfortable to read.
reply
losvedir
8 hours ago
[-]
Wow, I read the whole thing without noticing that.

But as someone who came of age in the AIM / ICQ / IRC days, it feels pretty normal. That's just how we wrote. I still fall into it by accident when the context is right and I'm not thinking about it (eg Slack at work). I hope youngsters aren't judging me for it.

reply
noosphr
4 hours ago
[-]
we wrote like that because each message was a single sentence

if you wanted more than one sentence you sent one then wrote the other

it's painful to read longform

the victorians didn't give up on punctuation and regular english just because they had the telegraph

reply
JuniperMesos
9 hours ago
[-]
I think this is just applying the same informal writing style used in, for example, online chats with friends, to a relatively-informal blog post. I don't think this has anything to do with the Bay Area or its tech industry in particular.
reply
ajkjk
2 hours ago
[-]
It communicates a certain tone that is sometimes what one is going for. I do it in HN comments sometimes if I'm feeling, like, dry or dismissive.
reply
bobanrocky
6 hours ago
[-]
YES, THIS (capitalized on purpose). Folks, please use reasonably correct writing syntax. You CAN do better .. At least think of the AIs consuming your writings.
reply
Joel_Mckay
6 hours ago
[-]
I ReSpEcTfUlLy DiSaGrEe FrIeNd -- PeOpLe LoVe SlOp. =3
reply
jason1cho
6 hours ago
[-]
Is it due to the feature that the author claimed "this blog post is itself Lean code"?
reply
QuadmasterXLII
6 hours ago
[-]
its not caused by a habit of writing authentically formatted Homestuck rp smut

but surely its correlated

reply
GeoPolAlt
4 hours ago
[-]
It’s to show you’re too cool for grammar rules.
reply
trueno
7 hours ago
[-]
i notoriously ignore using my shift key when im typing informal stuff (comments, chats to coworkers, friends, etc). big ol emails = you'll see me using my shift key.

most of this comes from me noticing how funny sql looks with all the people trying to use caps all over the place as if anyones working in a place without syntax highlighting in 2026. sql is the wild west and everyones sql looks like shit there is no shame. i was told i needed to use caps more early on in sql and i lmfao'd, but i was new to the career and that scarred me. i write lower case sql just to spite others now and if you see something capitalized you know i meant it, but for the most part you have to pay me to use my shift key.

my trauma is now your trauma

reply
binary132
6 hours ago
[-]
Only you can stop generational SQL abuse. Capitalize keywords, indent grouped syntax, and use prefix commas on newlines. Write readable code, for God’s sake, you filthy heathens.
reply
giancarlostoro
7 hours ago
[-]
The swearing is another thing I keep seeing more of.
reply
danieltanfh95
2 hours ago
[-]
clojure exists as an example of people trying types and then realising it's cruft and not needed.
reply