J语言开发CGOL游戏:verb中添加注释为何影响运行结果?
问题原因:J语言的行延续与语法解析规则
这不是J的bug,是你没注意到J的无分隔符行延续语法导致的解析歧义。
你的第一版代码中,两行代码紧挨着:
res =. ,/ ({."1 pos) r"(0 0) ({:"1 pos) (size,size) $ res
J的解析器会把第二行开头的(size,size)和第一行结尾的)合并,解析成:
res =. ,/ ({."1 pos) r"(0 0) (({:"1 pos)(size,size)) $ res
也就是把{:"1 pos得到的结果当作一个verb,去调用(size,size)作为参数,这显然不符合你预期的语法,最终导致整个表达式无法返回有效的名词,触发“noun result required in next”错误。
而加入NB.注释行后,相当于在两行之间插入了明确的语法分隔,解析器会正确识别这是两个独立的表达式:
- 第一行完成
res的赋值 - 第二行执行
(size,size) $ res并返回这个名词结果,符合verb的返回要求,因此代码正常运行。
解决方法
除了加注释行,你也可以通过以下方式避免这个解析歧义:
- 在第一行结尾加上分号
;,明确表示该行语句结束:next =: 3 :0 res =. ,/ ({."1 pos) r"(0 0) ({:"1 pos); (size,size) $ res ) - 给第二行的表达式添加明确的换行分隔(最可靠的还是分号或注释)。
内容的提问来源于stack exchange,提问作者Archie
相关产品推荐
相关产品推荐

