这篇文章详细介绍了 Hoot Scheme-to-Wasm 编译器如何使用 Continuation-Passing Style (CPS) 变换来实现 push 调用。文章首先解释了 Scheme 中尾调用和非尾调用的区别,以及在 WebAssembly 中实现 push 调用的挑战。然后,文章探讨了三种可能的实现策略:通用切片、插桩切片和 CPS 变换,并解释了 Hoot 选择 CPS 变换的原因。最后,文章讨论了 Hoot 在实现 CPS 变换时遇到的一些挑战和解决方案,例如如何拆分函数、如何保存变量以及如何处理调用约定等。