【问题标题】:Convert Scheme to C++将 Scheme 转换为 C++
【发布时间】:2020-08-15 11:55:25
【问题描述】:

我被分配了一个任务,我必须将一个 Scheme 函数转换为一个 C++ 函数。这是 Scheme 函数:

(DEFINE someFunction
   (LAMBDA (n)
      (IF (>= n 0)
         n
         (- 0 n))))

如果我错了,请纠正我,但 DEFINE 将名称 someFunction 绑定到 LAMBDA 表达式 n。如果n 大于或等于0,则简单地返回n。否则返回0 - n

这是我将其转换为 C++ 时的想法:

int someFunction() {
   int n;
   if (n >= 0) 
      return n;
   else
      return (0 - n);
}

我做对了吗?任何提示都会有所帮助!我想知道我做错了什么,所以不要退缩。

【问题讨论】:

  • 如果我正确阅读了一些文档,在 Scheme 代码中,变量 n 被认为是函数本身的参数。您的 C++ 代码使用 n 作为本地变量,更重要的是 uninitialized 变量。 C++ 中未初始化的局部(非静态)变量将具有 indeterminate(看似随机或垃圾)值,并且在未初始化的情况下使用此类变量会导致 未定义行为
  • 如果我正确理解你的功能,它相当于std::abs。除非您有学校或书本练习,否则请始终使用标准函数,而不是自己发明。

标签: c++ lambda scheme translate


【解决方案1】:

lambda 表达式没有名称;它是一个接受一个参数的函数,该参数称为“n”。
n 不是局部变量。)

您忘记在 C++ 版本中将 n 设为参数。

“最等效”的 C++ 版本是

auto someFunction = [](int n) { return n >= 0 ? n : -n; };

但你可能会写

int someFunction(int n) {
    return n >= 0 ? n : -n;
}

【讨论】:

    【解决方案2】:

    您错过了一个问题:lambda 表达式中的n 是一个函数参数。在您的 C++ 代码中,您将其声明为局部变量(未初始化,因此具有未定义的值)

    更好的解决方案是:

    int someFunction(int n) {
       if (n >= 0) 
          return n;
       else
          return (0 - n);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多