17d71da025
refactor: remove unnecessary comments from structural sharing implementation
...
Remove verbose inline and doc comments added in the structural sharing PR.
The code is self-explanatory and the comments were redundant.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-10 20:58:25 -05:00
b52a7596ef
perf: implement structural sharing for expression trees
...
Replace mutable in-place expression modification with immutable
expressions that use structural sharing. This eliminates unnecessary
copying during variable substitution and beta reduction.
## Changes
- Make expression fields unexported (immutable by design)
- Convert Substitute() and Rename() to return new expressions
- Implement structural sharing: return self when unchanged
- Remove Copy() method entirely
- Add getter methods for expression fields
## Performance Impact
Benchmarked across all samples:
| Sample | Before | After | Improvement |
|-------------|--------|-------|-------------|
| church | 230ms | 170ms | 26% faster |
| saccharine | 320ms | 160ms | 50% faster |
| simple | 30ms | 20ms | 33% faster |
## Key Optimization
Previously, variable substitution created deep copies:
```go
*e = replacement.Copy() // Deep copy entire tree
```
Now uses structural sharing:
```go
return replacement // Share pointer directly
```
This eliminates 100% of Copy() allocation overhead (10-50ms per sample).
## Files Modified
- pkg/lambda/expression.go: Unexport fields, remove Copy(), add methods
- pkg/lambda/substitute.go: Functional API with structural sharing
- pkg/lambda/rename.go: Functional API with structural sharing
- pkg/lambda/reduce.go: Use new functional API
- pkg/lambda/get_free_variables.go: Access unexported fields
- pkg/lambda/is_free_variable.go: Access unexported fields
- pkg/lambda/stringify.go: Access unexported fields
2026-01-10 20:16:57 -05:00
242fda3b4a
feat: progress
2026-01-10 11:37:18 -05:00
2499921679
style: moved functions around
2025-12-30 15:58:14 -05:00
412d3924eb
docs: document methods
2025-12-29 20:44:55 -05:00
aabe92f2dc
fix: cannot omit final newline
2025-12-29 20:17:50 -05:00
a2ce5b6897
feat: rename profiler to performance, typeless event emitter
2025-12-29 01:15:14 -05:00
c2b397a9f6
feat: observer pattern for statistics
2025-12-29 00:51:50 -05:00
6be3b7958a
feat: use iterative approach for reduce once
2025-12-28 02:37:22 -05:00
633d4a4d3b
fix: no stringify in hot loop
2025-12-28 02:19:48 -05:00
ee9e71d58e
fix: no ds store
2025-12-28 02:07:46 -05:00
0945cedf51
feat: only compute all free variables during a-conversion
2025-12-28 02:07:14 -05:00
4d81aca0b2
feat: fun little program
2025-12-28 00:53:43 -05:00
f4897d53a9
feat: it works!
2025-12-27 23:51:04 -05:00
f038d0a685
feat: parse saccharine, conversion incoming
2025-12-27 23:36:44 -05:00
14fc4b30da
feat: cleaner parsing functions
2025-12-27 20:46:10 -05:00
c37e96770f
feat: tokenizer accepts braces, line terminator, and equal sign
2025-12-27 19:52:18 -05:00
0e185fbf41
feat: expression
2025-12-27 03:43:19 -05:00
bf0edfc593
style: renamed token index to column
2025-12-27 02:43:17 -05:00
1896cd652d
feat: better error messages
2025-12-27 02:39:56 -05:00
884180de92
feat: error for when there is more source code than parsed
2025-12-27 02:08:18 -05:00
df53409887
fix: parameters converted in opposite order
2025-12-27 01:41:00 -05:00
5841023dde
fix: no log errors
2025-12-27 01:18:52 -05:00
a05a63627e
feat: better recursive descent
2025-12-27 01:18:06 -05:00
e3629acb45
feat: stuff
2025-12-26 03:37:05 -05:00
d427703afe
wip: new folder structure, overhaul language
2025-12-26 02:39:15 -05:00
11e7f70625
feat: stuff
2025-12-26 01:59:56 -05:00
fa44051dec
fix: don`t overlap "close"
2025-12-26 01:03:06 -05:00
c2ec9127e8
style: no capitalized error messages
2025-12-26 00:08:36 -05:00
17fa94113a
style: no capitalized error messages
2025-12-26 00:08:15 -05:00
d74894223e
fix: does need to compare to true
2025-12-26 00:07:10 -05:00
5ff8892d13
style: no underscores in variable names
2025-12-26 00:04:41 -05:00
44046e6abb
fix: drop zero-init of fresh name generator
2025-12-26 00:02:32 -05:00
c80587d522
style: unneeded else
2025-12-26 00:01:15 -05:00
6f3b252819
style: no "this" or "self" as receiver
2025-12-26 00:00:10 -05:00
e6e4a0df6f
style: no punctuation or capitalization in errors
2025-12-25 23:52:39 -05:00
32b1ba12f4
feat: golangci lint
2025-12-25 23:48:39 -05:00
d9deee0734
fix: cannot parse just a token
2025-12-25 02:00:04 -05:00
99703c2587
fix: unbound substitutions, explanation tag
2025-12-25 01:55:46 -05:00
88ee4f799e
feat: reducer works
2025-12-25 00:40:34 -05:00
d5999e8e1c
feat: reducer, but doesn`t work
2025-12-25 00:30:15 -05:00
2c3ce9baf7
feat: wogihrsoiuvjsroirgj
2025-12-24 14:55:33 -05:00
1d8ecba118
feat: parser
2025-12-23 21:54:42 -05:00
61bb622dcd
feat: tokenizer
2025-12-23 14:17:43 -05:00