2

这个警告是什么意思?有什么办法可以避免这个警告?我试图从这里的编译器代码中理解消息,但我不能。

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.
4

1 回答 1

2

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

事实上,可以在 Java 级别重新分配这些字段。在这种情况下,弗雷格代码仍然可以返回它可能缓存在某处的先前值。或者它可能违反参照透明度,所以这sysin并不意味着到处都是一样的。

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

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

dosomething sysin

代替

sysin >>= dosomething

例如,这用于 in 、frege.java.IOwhere和以这种方式定义。stdinstdoutstderr

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

于 2014-11-09T16:22:14.423 回答