2014-11-08 58 views
2

此警告是什么意思?有什么办法可以避免这种警告?我试图理解来自编译器代码here的消息,但我不能。对原生可变字段的警告

frege> native sysin "java.lang.System.in" :: InputStream 
native function sysin :: InputStream 

3: note that the java expression 
java.lang.System.in is supposed to be 
constant. 

我也尝试下面的代码,但得到了同样的警告:

frege> native sysin "java.lang.System.in" :: MutableIO InputStream 
native function sysin :: MutableIO InputStream 

3: note that the java expression 
java.lang.System.in is supposed to be 
constant. 

回答

2

它只是一个提醒的是,Java值可以在程序的生命周期变化,但你,程序员,通过使用这种表示法假定其事实上的不变性。

实际上,可以在Java级别上重新分配这些字段。在这种情况下,Frege代码仍然可以返回可能已经缓存在某处的以前的值。或者它可能会违反参考透明度,因此sysin并不意味着在任何地方都一样。

如果您需要确保获得可变字段的当前值,则需要将其声明为IO或ST。

此功能被认为作为案件救灾时,我们知道,一个价值不会改变,因此,我们可以这样写:

dosomething sysin 

,而不是

sysin >>= dosomething 

这是用来,例如,在frege.java.IO中,其中stdin,stdoutstderr是这样定义的。

警告不能被抑制,除非编译nowarn。除非您绝对确信自己做的是正确的事情,即恰当的IO或ST操作会始终产生相同的值,否则不应使用此功能。

+0

非常好!谢谢!如果我们更新警告消息以清楚说明,它会有用吗? – 2014-11-09 16:37:50

+0

亲爱的@MarimuthuMadasamy,我总是很感谢你在这方面的投入,正如你可能知道的那样。请提出建议! – Ingo 2014-11-09 16:53:06

+0

拉入请求! :) – 2014-11-09 17:40:56