对本机可变字段的警告

时间:2014-11-08 20:27:03

标签: frege

这个警告意味着什么?我们有什么方法可以避免这种警告吗?我试图理解编译器代码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.

1 个答案:

答案 0 :(得分:2)

这只是一个提醒,java值可能会在程序的生命周期内发生变化,但是程序员通过使用这种表示法来假设其事实上的不变性。

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

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

当我们知道某个值不会改变时,这个特性被认为是一种解脱,因此我们可以写下:

dosomething sysin

而不是

sysin >>= dosomething

例如,在[{1}}中使用了这一点,其中frege.java.IOstdinstdout就是这样定义的。

除非使用nowarn进行编译,否则无法抑制警告。除非你绝对确定你正在做正确的事情,即当正确的IO或ST动作始终产生相同的值时,否则不应该使用此功能。