diff --git a/Makefile b/Makefile index 3e2d091..58ac026 100644 --- a/Makefile +++ b/Makefile @@ -4,17 +4,13 @@ it: @ go build -o ${BINARY_NAME} ./cmd/lambda @ chmod +x ${BINARY_NAME} -simple: it - @ ./lambda.exe -p profile/cpu.prof - < ./samples/simple.txt > program.out +TEST=simple -thunk: it - @ ./lambda.exe -p profile/cpu.prof - < ./samples/thunk.txt > program.out +run: it + @ ./lambda.exe - < ./samples/$(TEST).txt > program.out -saccharine: it - @ ./lambda.exe -p profile/cpu.prof - < ./samples/saccharine.txt > program.out - -church: it - @ ./lambda.exe -p profile/cpu.prof - < ./samples/church.txt > program.out +profile: it + @ ./lambda.exe -p profile/cpu.prof - < ./samples/$(TEST).txt > program.out prof: @ go tool pprof -top profile/cpu.prof diff --git a/cmd/lambda/lambda.go b/cmd/lambda/lambda.go index 4c8dc17..2f9116e 100644 --- a/cmd/lambda/lambda.go +++ b/cmd/lambda/lambda.go @@ -7,6 +7,7 @@ import ( "git.maximhutz.com/max/lambda/internal/cli" "git.maximhutz.com/max/lambda/internal/config" "git.maximhutz.com/max/lambda/internal/executer" + "git.maximhutz.com/max/lambda/internal/explanation" "git.maximhutz.com/max/lambda/internal/performance" "git.maximhutz.com/max/lambda/internal/statistics" "git.maximhutz.com/max/lambda/pkg/convert" @@ -43,20 +44,23 @@ func main() { logger.Info("compiled lambda expression", "tree", lambda.Stringify(compiled)) } - process := executer.New(options) + process := executer.New(options, &compiled) if options.Profile != "" { profiler := performance.Track(options.Profile) process.On("start", profiler.Start) process.On("end", profiler.End) } + if options.Explanation { + explanation.Track(process) + } + statistics := statistics.Track() process.On("start", statistics.Start) process.On("step", statistics.Step) process.On("end", statistics.End) - process.Run(&compiled) - cli.HandleError(err) + process.Run() fmt.Println(lambda.Stringify(compiled)) fmt.Fprint(os.Stderr, statistics.Results.String()) diff --git a/internal/executer/executer.go b/internal/executer/executer.go index 69d1fe0..d3fa123 100644 --- a/internal/executer/executer.go +++ b/internal/executer/executer.go @@ -1,7 +1,6 @@ package executer import ( - "fmt" "log/slog" "git.maximhutz.com/max/lambda/internal/config" @@ -10,28 +9,22 @@ import ( ) type Executor struct { - Config *config.Config + Config *config.Config + Expression *lambda.Expression emitter.Emitter } -func New(config *config.Config) *Executor { - return &Executor{Config: config} +func New(config *config.Config, expression *lambda.Expression) *Executor { + return &Executor{Config: config, Expression: expression} } -func (e Executor) Run(expr *lambda.Expression) { +func (e Executor) Run() { e.Emit("start") - if e.Config.Explanation { - fmt.Println(lambda.Stringify(*expr)) - } - - for lambda.ReduceOnce(expr) { + for lambda.ReduceOnce(e.Expression) { e.Emit("step") if e.Config.Verbose { - slog.Info("reduction", "tree", lambda.Stringify(*expr)) - } - if e.Config.Explanation { - fmt.Println(" =", lambda.Stringify(*expr)) + slog.Info("reduction", "tree", lambda.Stringify(*e.Expression)) } } diff --git a/internal/explanation/tracker.go b/internal/explanation/tracker.go new file mode 100644 index 0000000..9e9ef98 --- /dev/null +++ b/internal/explanation/tracker.go @@ -0,0 +1,28 @@ +package explanation + +import ( + "fmt" + + "git.maximhutz.com/max/lambda/internal/executer" + "git.maximhutz.com/max/lambda/pkg/lambda" +) + +type Tracker struct { + process *executer.Executor +} + +func Track(process *executer.Executor) *Tracker { + tracker := &Tracker{process: process} + process.On("start", tracker.Start) + process.On("step", tracker.Step) + + return tracker +} + +func (t *Tracker) Start() { + fmt.Println(lambda.Stringify(*t.process.Expression)) +} + +func (t *Tracker) Step() { + fmt.Println(" =", lambda.Stringify(*t.process.Expression)) +} diff --git a/internal/performance/performance.go b/internal/performance/tracker.go similarity index 100% rename from internal/performance/performance.go rename to internal/performance/tracker.go diff --git a/internal/statistics/statistics.go b/internal/statistics/tracker.go similarity index 100% rename from internal/statistics/statistics.go rename to internal/statistics/tracker.go