2014-11-08 55 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