移植rust代码的时候遇到匪夷所思的bug,最后查证Vec::resize(len, a)会在内部调用Clone的实现 ,而moonbit因为缺少Clone所以resize传入了同一个引用最后引发了bug,但标准库也没有提供resize_with(len, i => {})的immut方法
另外提一个主题无关的,lambda表达式语法采用fn() {}而不是() => 是有什么原因吗?感觉写起来还是相当相当麻烦,特别是需要curry化的场合
移植rust代码的时候遇到匪夷所思的bug,最后查证Vec::resize(len, a)会在内部调用Clone的实现 ,而moonbit因为缺少Clone所以resize传入了同一个引用最后引发了bug,但标准库也没有提供resize_with(len, i => {})的immut方法
另外提一个主题无关的,lambda表达式语法采用fn() {}而不是() => 是有什么原因吗?感觉写起来还是相当相当麻烦,特别是需要curry化的场合
可以等后续core加一个Array::resizei(Int, (Int)->A)
, 或者先使用Ref[Array[A]]
。
lambda表达式采用fn(){}
是因为(abcd)=>...
前半部分会有歧义,对于一个很长的参数列表需要一直找到=>
才能确定它是lambda。我们想要控制语言实现的复杂度,选择了前者。curry化只是部分应用的一种方式,在MoonBit中更idiomatic的方式应该是用pipe opeartor
fn关键字可以理解,但后面必须跟着大括号感觉还是有点繁琐了,可以效仿rust省略大括号就更好了
另外感觉确实需要占位符语法
这边建议可以再增加一些关于占位符的语法糖,比如占位符风格的匿名函数:
将 f(g(_, b)) 视作 f(fn(_a) {g(_a, b)})
可以一定程度减少代码量又不会过于复杂