无法在节点v6.4.0中启用尾部呼叫优化

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

  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

球拍中的function与预期相同:

 #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所build议的那样。 它在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万个recursion级别:

 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)); 

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

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

这基本上是改变return ret但目前我以前使用的macros似乎不适用于当前版本的Sweet.js – 我有一些时间,我必须调查它。

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