fix: no stringify in hot loop

This commit is contained in:
2025-12-28 02:19:48 -05:00
parent ee9e71d58e
commit 633d4a4d3b
4 changed files with 25 additions and 11 deletions

View File

@@ -13,6 +13,9 @@ thunk: it
saccharine: it
@ ./lambda.exe - < ./samples/saccharine.txt
church: it
@ ./lambda.exe - < ./samples/church.txt
prof:
@ go tool pprof -top profile/cpu.prof

View File

@@ -41,10 +41,14 @@ func main() {
// Turn tokens into syntax tree.
expression, err := saccharine.Parse(tokens)
cli.HandleError(err)
logger.Info("parsed syntax tree", "tree", saccharine.Stringify(expression))
if options.Verbose {
logger.Info("parsed syntax tree", "tree", saccharine.Stringify(expression))
}
compiled := convert.SaccharineToLambda(expression)
logger.Info("compiled lambda expression", "tree", lambda.Stringify(compiled))
if options.Verbose {
logger.Info("compiled lambda expression", "tree", lambda.Stringify(compiled))
}
// Reduce expression.
start := time.Now()
@@ -56,7 +60,9 @@ func main() {
steps := 0
for lambda.ReduceOnce(&compiled) {
logger.Info("reduction", "tree", lambda.Stringify(compiled))
if options.Verbose {
logger.Info("reduction", "tree", lambda.Stringify(compiled))
}
if options.Explanation {
fmt.Println(" =", lambda.Stringify(compiled))
}

View File

@@ -11,16 +11,14 @@ func Substitute(e *Expression, target string, replacement Expression) {
return
}
if !IsFreeVariable(typed.Parameter, replacement) {
Substitute(&typed.Body, target, replacement)
return
if IsFreeVariable(typed.Parameter, replacement) {
replacementFreeVars := GetFreeVariables(replacement)
used := GetFreeVariables(typed.Body)
used.Merge(replacementFreeVars)
freshVar := GenerateFreshName(used)
Rename(typed, typed.Parameter, freshVar)
}
replacementFreeVars := GetFreeVariables(replacement)
used := GetFreeVariables(typed.Body)
used.Merge(replacementFreeVars)
freshVar := GenerateFreshName(used)
Rename(typed, typed.Parameter, freshVar)
Substitute(&typed.Body, target, replacement)
case *Application:
Substitute(&typed.Abstraction, target, replacement)

7
samples/church.txt Normal file
View File

@@ -0,0 +1,7 @@
0 := \f.\x.x
inc n := \f x.(f (n f x))
exp n m := (m n)
N := (inc (inc (inc (inc (inc 0)))))
(exp N N)