不能在节点v6.4.0中启用尾部调用优化

Can't enable tail call optimization in node v6.4.0

本文关键字:启用 尾部 调用 优化 节点 v6 不能      更新时间:2023-09-26

我不想在node/es2015中玩尾部调用优化,但我一直得到RangeError: Maximum call stack size exceeded。所以我尝试了一个非常简单的测试函数:

  function countTo(n, acc) {
    if(n === 0) {
      return acc;
    }
    return countTo(n - 1, acc + n);
  }
  console.log(countTo(100000 , 0))

仍然失败。我试过在函数体内和文件的顶部添加'use strict';。我试过使用--harmony--harmony-tailcalls

相同的函数在球拍中工作:

#lang racket
(define count-to
  (lambda (n acc)
    (cond
      ((= n 0) acc)
      (else (count-to (- n 1) (+ acc n))))))
(count-to 100000000 0)
; ~> 5000000050000000
<标题>编辑:

正如@MatthieuLemoine建议的那样。它可以在v6.5.0+中使用"use strict";--harmony--harmony-tailcalls

如果使用节点v6.5.0,下面的工作如下:

function countTo(n, acc) {
  'use strict';
  if(n === 0) {
    return acc;
  }
  return countTo(n - 1, acc + n);
}
console.log(countTo(100000 , 0));

使用--harmony-tailcalls标志运行:

node --harmony-tailcalls tco.js

您可以使用tco模块来模拟即使在旧节点上的尾部调用优化。我将在一分钟内添加一个使用您的代码的示例。

稍微改变一下你的代码,你甚至可以运行1000万层递归:

var tco = require('tco');
var countTo = tco(function (n, acc) {
  if (n === 0) {
    return [null, acc];
  }
  return [countTo, [n - 1, acc + n]];
});
console.log(countTo(10000000, 0));

你可以使用Sweet宏使它看起来更像:

var countTo = tco(function (n, acc) {
  if (n === 0) {
    ret acc;
  }
  ret countTo(n - 1, acc + n);
});
console.log(countTo(10000000, 0));

这基本上是改变returnret,但目前我以前使用的宏似乎不与当前版本的Sweet.js工作-我必须调查它,当我有一些时间。

免责声明:我是该模块的作者。