From 0945cedf5159d2979f54187c7cca6fc8353b59a4 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 28 Dec 2025 02:07:14 -0500 Subject: [PATCH] feat: only compute all free variables during a-conversion --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 2 ++ Makefile | 10 +++++++++- cmd/.DS_Store | Bin 0 -> 6148 bytes cmd/lambda/lambda.go | 9 +++++++++ internal/.DS_Store | Bin 0 -> 6148 bytes pkg/.DS_Store | Bin 0 -> 6148 bytes pkg/lambda/is_free_variable.go | 14 ++++++++++++++ pkg/lambda/substitute.go | 4 ++-- pkg/saccharine/.DS_Store | Bin 0 -> 6148 bytes 10 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 .DS_Store create mode 100644 cmd/.DS_Store create mode 100644 internal/.DS_Store create mode 100644 pkg/.DS_Store create mode 100644 pkg/lambda/is_free_variable.go create mode 100644 pkg/saccharine/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ea3fae12464c82ad1d6893b828c8dd5adfa3149f GIT binary patch literal 6148 zcmeHKu}%U(5S^7vB+_7FVPfGG)+(XU@+4SV(HjH|8aN<=l}4_x(Z(?B|xUB|EYPR6Iw! zS*X;zaW54q1EPQ^@D~-}Z#STAYSK9kyze*DxpjSUw_L8ZyETkuKMSu{!{qtE_c!MH zduPtxuyg0wEgzL&sk6P69t9jU)c-$JAt2<+>z0Gr((_W8H zRhe&@`dEDo);6^0`@F$pI>O~YJ{rBe4YdZp=5gzo9p%+yeiyDuZ1D>4mj=t`3`#Ew zhytR(j{>|uglLSB#l)cAI?(AW05HI?HazoPf^$NPk;TLyJTPTafhJYiD~2-Z7!Pe+ zWHB*l(n)D%%ww6Ay`d=0j`2{3lZp&VFA9hPz5*HZn& profile/cpu.svg + @ open profile/cpu.svg + saccharineX: it - @ ./lambda.exe -x - < ./samples/saccharine.txt > saccharine.out \ No newline at end of file + @ ./lambda.exe -x - < ./samples/saccharine.txt > saccharine.out diff --git a/cmd/.DS_Store b/cmd/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..85ac39e0c192c9730028a82202946b49e72e7c58 GIT binary patch literal 6148 zcmeH~O=`n15QS&j5DeX9nWe4}=mFH=o*)-U97DUXaW>s$p@Z~3U3bx=bXn+|pO&OH zbQemQ0qIGjk!*ipjYLGeeri`l3nHpeL|GaWChp0hD-WJQS=VT3*FCH@`=LKfEc6#$ z^6qo$Xh%IYGc%wcAP@wCz&8Qe9}*hm0D({E$}aZ+ literal 0 HcmV?d00001 diff --git a/cmd/lambda/lambda.go b/cmd/lambda/lambda.go index bbc9242..b593434 100644 --- a/cmd/lambda/lambda.go +++ b/cmd/lambda/lambda.go @@ -3,6 +3,7 @@ package main import ( "fmt" "os" + "runtime/pprof" "time" "git.maximhutz.com/max/lambda/internal/cli" @@ -14,6 +15,14 @@ import ( // Run main application. func main() { + f, err := os.Create("profile/cpu.prof") + cli.HandleError(err) + defer f.Close() + + err = pprof.StartCPUProfile(f) + cli.HandleError(err) + defer pprof.StopCPUProfile() + options, err := config.FromArgs() cli.HandleError(err) diff --git a/internal/.DS_Store b/internal/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..40a0c4e112c1d0e0286e0de63e6d6dde68fdc996 GIT binary patch literal 6148 zcmeHKOHRWu5S^g`BC+WTkYM2}^aiF1C+G!GTM;TXq#L%7W3b>1T!SOA<&9^cF$9(f zl^Mx?&U~FG#m*2BPw$o!qA?Mb7=kQ|0TK0}Y0sR+$dY3+TeQt)AjRKR$=*k_pf#=5 zb$|cG)7H|oRW)C?b7;!*{fFn*`fz&Od%yO{ zaeZdBvm8yk-NAQ0`97lT!^IhJ2AlzB;D0iJJ6ohYQuNswa0Z-#4+i9X2pEFVuv1J& z2d2~l01K#-U@g6b#00}=*eSvSVGRXpC|irc8V-Fhzi8MgYB;eqA8eK1n-@;ikv}AN z;;87eGvEy542<+~EcgE literal 0 HcmV?d00001 diff --git a/pkg/.DS_Store b/pkg/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..65e24b3a13f329ba20971d4bc3f7ebbbf589435a GIT binary patch literal 6148 zcmeHLyH3L}6upK5r7WRHWkPtsWU!q8DQ_5=svas_B3{3n4VnF-> z5-VTAx%avxCMhr>K)#iIQu{df&3GU~Ti4of}3p8?$ zCiUsKy}!I$k1}lE;2rP|{5A*p*`1&|MbxEJN33a zZ^m%9^u?JEZkR{pO!cPoF3jI-zv{i>Fp?|JXXNDPYyL}tJ)5IArRZz#fOo(<@a_Pw z4*?2eXfallr300`0ssqWmcX&B#lV0YfT6`$5iJO#LxDQf*jEgr!_gjCUT85^)Zt_# zGtOf(8~cW0Bsep%B|2Kxe|GR_yH}8OV;9ogl3YFbT8JA@D z*38B6UK^n7p>QxSR+J&A>~<^%ycP5R3KHlG_y8DMj1|#>@IM5^248sxe$;_Cm3qed literal 0 HcmV?d00001 diff --git a/pkg/lambda/is_free_variable.go b/pkg/lambda/is_free_variable.go new file mode 100644 index 0000000..deb3492 --- /dev/null +++ b/pkg/lambda/is_free_variable.go @@ -0,0 +1,14 @@ +package lambda + +func IsFreeVariable(n string, e Expression) bool { + switch e := e.(type) { + case *Variable: + return e.Value == n + case *Abstraction: + return e.Parameter != n && IsFreeVariable(n, e.Body) + case *Application: + return IsFreeVariable(n, e.Abstraction) || IsFreeVariable(n, e.Argument) + default: + return false + } +} diff --git a/pkg/lambda/substitute.go b/pkg/lambda/substitute.go index ebc83c5..96d4ec2 100644 --- a/pkg/lambda/substitute.go +++ b/pkg/lambda/substitute.go @@ -11,12 +11,12 @@ func Substitute(e *Expression, target string, replacement Expression) { return } - replacementFreeVars := GetFreeVariables(replacement) - if !replacementFreeVars.Has(typed.Parameter) { + if !IsFreeVariable(typed.Parameter, replacement) { Substitute(&typed.Body, target, replacement) return } + replacementFreeVars := GetFreeVariables(replacement) used := GetFreeVariables(typed.Body) used.Merge(replacementFreeVars) freshVar := GenerateFreshName(used) diff --git a/pkg/saccharine/.DS_Store b/pkg/saccharine/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6342c25db7bd2adcee7e9ee616c16644936f8994 GIT binary patch literal 6148 zcmeHKOHRWu5S?j@h{S>}S^5gSL8!utWiJ3F2qYR(iFRFI0mLmh0}EE{xB++J&5WV3 zh*+WuW+eOB^YJ7vipM4*p04W&(U^z|G(na@kBGY0G)T^3WLaY}yJ(wb&l0<% zIo;7}an*hP{ll%LX{&0!Xy?!r?=Nppr}6c;Yps8_x1Be^LFB!cALB3BhN42*~J-f2AlzB;GZ*qnk`Zs7<%svI0MeW7Xz|C1T?`i zVKmgO1D#$0fFr0?FxE3BFo*(JCX9yAK-fZo7Ru?0!4?jENPcC)XlUWYni=b)%%7JR zPA6Or>P}o5dhZN4133djn~tUapWs*Oz2xU1K63_~fj`CokE&TU#Y?5y`t9|k)&{gQ uG!gNOGJs&Lr5LEC7!%n?j?`%OAY<6egwaq|5xs^3{UD%(c;^iK0s|ji=tVUE literal 0 HcmV?d00001