不能在节点v6.4.0中启用尾部调用优化
Can't enable tail call optimization in node v6.4.0
我不想在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));
这基本上是改变return
到ret
,但目前我以前使用的宏似乎不与当前版本的Sweet.js工作-我必须调查它,当我有一些时间。
免责声明:我是该模块的作者。
相关文章:
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 如何在 API 调用后和 if 语句中启用提交按钮
- 语义ui如何使用javascript启用或禁用下拉列表
- IE6在启用/禁用文本字段上闪烁
- 传单中如何在更改基层时启用/禁用覆盖层
- 根据字段的值启用按钮
- 如何使用javascript函数在gridview中按行启用/禁用复选框
- 如何禁用和启用css规则
- 淘汰赛.JS'启用'长度绑定条件不起作用
- 如何动态检测Mozilla/Chrome上是否启用SSO
- JavaScript尾部调用中的函数是否经过优化
- 旋转木马;启用内容安全策略时无法工作
- 动态启用/禁用来自控制器的输入文本
- 如何启用单选按钮
- 检查浏览器'在asp.net的后端代码中启用或禁用了s JS
- jQuery根据用户选择启用/禁用asp.net控件
- 当我的所有 Ng-from 都有效时启用一个按钮
- 在Golang回调函数中启用CORS
- 启用具有多个布尔可观察标志的绑定
- 不能在节点v6.4.0中启用尾部调用优化