crosslang/golang-lean/README.md
Maximus Gorog fd3d42ae33 Add 'golang-lean/' from commit 'f5f17019224c6a6c319387214ceb8e29d09251c6'
git-subtree-dir: golang-lean
git-subtree-mainline: 6487c7046f
git-subtree-split: f5f1701922
2026-05-12 02:59:14 -06:00

64 lines
2.5 KiB
Markdown

# golang-lean
A Lean 4 reimplementation of the [Go programming language](https://go.dev/) — using the upstream reference compiler/parser as the source of truth, the way `octive-lean` uses GNU Octave.
Built parallel to `octive-lean`. Goals:
1. **Working Go interpreter** for a useful subset (start: pure Go, no goroutines).
2. **Formal semantics** layered on top: `BigStep` / `PureEval` / `ValueEquiv` so proofs about Go programs are first-class.
3. **Cross-language layer** — once both this and `octive-lean` have a real evaluator and big-step semantics, factor a shared core out of two concrete points rather than guessing the abstraction in advance.
## Build
```sh
lake build
```
Requires the Lean toolchain pinned in [`lean-toolchain`](lean-toolchain). [`elan`](https://github.com/leanprover/elan) will pick it up automatically.
## Run
```sh
# REPL stub
lake exe golang-lean
# Run a .go script (not yet implemented)
lake exe golang-lean path/to/script.go
# Verify the corpus against expected outputs
lake build corpus-check
lake exe corpus-check
```
## Layout
| Path | What's there |
| --- | --- |
| `GolangLean/` | Library: `Token`, `Scanner`, `AST`, `Parser`, `Value`, `Env`, `Eval`, `Builtins`, `REPL`, `BigStep`, `PureEval`, `ValueEquiv`, `Error` |
| `Main.lean` | Entry point — REPL or file runner |
| `CorpusCheck.lean` | Test driver for `corpus/` |
| `corpus/` | `.go` test cases paired with `.expected` outputs |
| `go-upstream/` | Shallow clone of `golang/go` (gitignored, used as reference) |
## Status
**Scaffold.** Module skeleton in place. `Token` and `AST` are real ports of `go/token` and `go/ast`. Scanner / Parser / Eval are stubs that throw `notImpl` so the project compiles.
Next:
1. Implement `Scanner.scan` against `go-upstream/src/go/scanner/scanner.go`.
2. Implement `Parser.parseFile` recursive-descent against `go-upstream/src/go/parser/parser.go`.
3. Implement `Eval` for the pure subset (no goroutines, no defer, no panic/recover).
4. Mirror octive-lean's `BigStep` / `ValueEquiv` triple.
## Reference
`go-upstream/` is a shallow clone of `https://github.com/golang/go`. Key paths:
| Path | What's there |
| --- | --- |
| `go-upstream/src/go/token/` | Token kinds, position tracking |
| `go-upstream/src/go/scanner/` | Lexer |
| `go-upstream/src/go/ast/` | AST node types |
| `go-upstream/src/go/parser/` | Recursive-descent parser |
| `go-upstream/src/go/types/` | Type-checker (later) |
| `go-upstream/src/runtime/` | Runtime / scheduler / GC (much later) |