关于netlogo闭包的测试

在代码区输入:

正常情况下会输出:

 Nothing named a has been defined.

但实际输出:

 2

???

复现失败,有更多细节吗?

@maizi20


测试发现需要let和run的上级上下文为同一个程序上下文

@jeremy.baker @Jason FYI - please use the translator. Looks like a real bug but could be just an undocumented feature.

分析:
在四种不同的上下文中只有ProcedureContext的registerStringRunVar方法会记录并维护变量表
Converter.compileRunString会引入同上下文的变量作为参数使用
但是registerStringRunVar只会在运行时注册变量和语句块绑定,跳过let语句会导致变量表中找不到变量
建议移除此特性,因为registerStringRunVar操作会严重影响由let定义的变量的写入效率

I’ve opened a ticket for this issue here.

已经在netlogo仓库里开了相应的ticket。

如果要设计一个性能模式,这确实也是一个思路(但还是那个问题,可能造成不可预见的bug。。。如果你写代码不够谨慎?)

是不是可以设计一个Developer mode开关,一些报错检测之类的在mode开启时才进行,否则跳过。。。之类的?

是的,我之前提议过这个,但是目前还木有什么优先级……

应该会包括在 NetLogo Web 性能优化这个项目里。