moonbit是否计划支持尾调用优化?

原以为moonbit作为函数式语言应该是支持的,但刚刚发现并不是这样。例如以下代码:

test {
  fn call(func) { func() }
  fn f() { call(f) }
  f()
}

如果有尾调用优化,效果应该是死循环,但运行的时候调用栈溢出了。所以我想问一下,moonbit是否计划支持尾调用优化?

v8和python都不支持,据说是为了方便trace。如果通过编译flag控制,或者显式声明某处需要尾递归优化,可以吗?

loop xs, 0 {
  Nil, acc => break acc // <=> Nil, acc => acc
  Cons(x, rest), acc => continue rest, x + acc
}

这个语法应该是有尾调用优化的,应该是独立语法显式声明用尾调用优化的设计吧

文档上说这个是“循环”,应该就是相当于一个带尾调用优化的尾递归的函数。不过我想问的是:非递归的函数,是否也能有尾调用优化?

有时候需要把尾调用当goto用,这种情况就不会递归。甚至被尾调用的那个函数需要在运行的时候才能确定:

fn start(next : () -> Unit) -> Unit {
  ...
  next()
}

这种情况就没法表示成loop了

1 个赞

暂时没有计划加通用的尾调用优化,原因是有些后端不好加,比如 js 后端,以及使用 C calling convention(有很多 callee saved register)的 native 后端。

尾递归优化是有的,一个函数在尾位置递归调用自己不会消耗额外的栈(哪怕这个函数有其他非尾的递归调用,那些尾的递归调用也依然会被优化掉)

2 个赞