在代码区输入:
to setup
ca
if true [
let a 2
]
carefully [
run "print a"
][print error-message]
end
正常情况下会输出:
Nothing named a has been defined.
但实际输出:
2
???
在代码区输入:
to setup
ca
if true [
let a 2
]
carefully [
run "print a"
][print error-message]
end
正常情况下会输出:
Nothing named a has been defined.
但实际输出:
2
???
复现失败,有更多细节吗?
@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开启时才进行,否则跳过。。。之类的?