0

我现在正在处理嵌套函数的任务,但在 java 中这是不可能的。我们曾考虑过 SML 中的嵌套函数。由于许多语言都不允许嵌套函数,因此我们认为激活记录带有嵌套链接。然而,我们被认为如何在图表和理论中做这些,并期望用 Java 做,但我不知道如何用 Java 做这些,因为我们甚至没有从他那里得到任何例子。我尝试在谷歌上搜索一些东西,但我找到的所有参考资料都非常基础,并没有真正的帮助。我会为此提供任何帮助。

以下是我们应该用 Java 编写的 SML 代码。

fun h (x,y) =
  let
    val z = x+1
    fun g w =
      let
        val z = y + 1
        fun f x =
          if x = 0 then 0
          else z + x + g(w - 1)
      in
        if w = 0 then x
        else z + f(w - 1)
      end
  in
    if x = 0 then g y
    else z + g(h(x - 1, y))
  end;

以下是我到目前为止尝试过的代码,但实际上什么都没有。

public int f(int w, int x, int y, int z) {
    if (x == 0) {
        return 0;
    } 
    else {
        return (z + x + g(w - 1, y));
    }
}

public int g(int w, int y) {
    int z = y + 1;
    return z;
}

public void h(int w, int x, int y) {
    int z = x + 1;
    g(w, y);
    f(w, x, y, z);
}

public void last(int w, int x, int y, int z) {
    
}

以下是作业中给出的详细信息:

考虑右框中定义的 ML 函数,其中函数 g 嵌套在函数 h 中,函数 f 嵌套在函数 g 中。您可以在文本文件中键入此函数,并在 ML 环境中使用“使用”来加载该函数并尝试一些输入以查看结果。这是一个快速增长的功能。该作业要求您在不支持嵌套函数的情况下使用 Java 在某些输入上计算函数 h。正如您将看到的,此功能迅速增长。

你可以在你的java程序中进行递归调用来简化你的任务,但是由于Java不允许你定义嵌套函数,你必须使用带有嵌套链接的激活记录技术来解决在外部函数中定义的非局部变量。您必须在报告中解释如何解决非局部变量问题。提示:您可以将激活记录的指针传递给被调用函数,作为被调用函数可能需要的嵌套链接。每个激活记录都应包含以下信息:

  1. 激活记录所属功能的名称。
  2. 包含所有局部变量及其值的符号表。
  3. 返回地址,当前函数完成并恢复之前的激活记录(即调用者)时要继续的点。
  4. 指向前一个激活记录(即调用者的激活记录)的指针。
  5. 用于解析非局部变量的嵌套链接。
  6. 保存此计算结果(要返回的值)的地方。由于这只是计算上面定义的特定函数的模拟,因此您不必为每个可能的函数设计通用激活记录。您可以针对上面定义的三个不同的 ML 函数定义三个不同的激活记录。

这些是直接从作业中给出的说明。

4

1 回答 1

0

不知道为什么任务建议使用激活记录。有一种称为lambda 提升的通用技术用于将局部函数转换为全局函数:只需添加函数使用的每个非局部变量作为附加参数。只要不以一流的方式将本地函数用作闭包,这就足够了。您的尝试已经朝着正确的方向前进,这是我将如何解决它:

public int f(int x, int g_z, int g_w, int h_x, int h_y) {
  if (x == 0) {
    return 0;
  } else {
    return g_z + x + g(g_w - 1, h_x, h_y);
  }
}

public int g(int w, int h_x, int h_y) {
  int z = h_y + 1;
  if (w == 0) {
    return h_x;
  } else {
    return z + f(w - 1, z, w, h_x, h_y);
  }
}

public int h(int x, int y) {
  int z = x + 1;
  if (x == 0) {
    return g(y, x, y);
  } else {
    return z + g(h(x - 1, y), x, y);
  }
}
于 2021-12-01T09:46:46.793 回答