c# - 编译嵌套的相互递归函数

标签 c# .net language-agnostic compiler-construction dynamic-language-runtime

我正在创建一种玩具动态语言(对 javascript 感到痛苦),虽然我的实现是在 DLR 之上,但我认为这个问题的解决方案与语言/平台无关。

我对编译递归函数或彼此相邻存在的相互递归函数没有问题。但事实证明,编译嵌套相互递归函数要困难得多。

下面是我用来测试的示例函数

void f(int x) {
 void g(int y) {
  if((x + y) < 100) {
   f(x + y);
  } else {
   print(x + y);
  }
 }
 g(x);
}

我认为解决这个问题的解决方案必须非常通用(也许我错了)而不是特定于 DLR,我想我必须以某种方式解除 g 的内部定义并在 f 之前定义它并仍然保留闭包上下文。

最佳答案

闭包通常表示为组合函数指针和参数列表。第一步确实是将所有嵌套函数提升到全局范围,并将其环境中的任何绑定(bind)变量作为参数。这相当于:

void _f(int x) 
{ 
  closure g = closure(_g,x);       
  call(g,x);  
}

void _g(int x, int y) 
{
  ...;
}

一旦你有了“闭包”和“调用”原语,它就可以工作了。在静态语言中,closure() 只会保留相关变量。在动态语言中,closure() 必须保持整个上下文堆栈可用,以防函数需要它。

关于c# - 编译嵌套的相互递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2021040/

相关文章:

Javascript Date valueOf 相当于 C# 中的值

javascript - 在没有 JS 警报的情况下,在加载时更改 ASP.NET 中的光标不起作用

c# - 当我将 json 字符串反序列化为 C# 对象时,类为空

c# - 使用 SSH.NET 库从 SFTP 下载文件

c# - 是否可以在 XP 上运行 .NET 4.5 应用程序?

language-agnostic - 我在哪里存储哈希表或字典键名

language-agnostic - 什么是哈希表和 HashMap 及其典型用例?

c# - 在 UWP 上以 Json 形式发送请求

c# - 在不重新启动程序的情况下更新列表框?

algorithm - 通过数组的最小异或路由的可能线性时间算法