2012-10-04 88 views
1

我發現了一個奇怪的行爲咖啡編譯器上的一個簡單表達式,它不同於coffeescript.org站點上的交互式編譯器反應。咖啡編譯器的奇怪行爲

當我嘗試編譯下一個字符串咖啡:

(console.log i; break) for i in [0..10]

我:

SyntaxError: In repl, cannot use a pure statement in an expression.at SyntaxError (unknown source) ...

但在coffescript.org互動編譯器相同的表達編譯就好了,正如我所預料的那樣:

var i, _i; 

for (i = _i = 0; _i <= 10; i = ++_i) { 
    console.log(i); 
    break; 
} 

爲什麼咖啡不喜歡()在這裏分組?

UPD

另一個奇怪的事情 - 它發生並非總是如此,有時,大量的嘗試和變化後,咖啡開始絕對正常編譯同樣的表情,沒有錯誤。

但似乎在互動模式下,咖啡總是失敗。

我發現了另一個奇怪的事情 - 只有當我使用'break'關鍵字時纔會發生此錯誤。表達式'(console.log i; i + 1)for i in [0..5]'工作得很好,並返回一個數組。

回答

4

問題是,REPL試圖給你每個表達式的結果(並保存爲_)。所以在內部,它的編譯

_ = ((console.log i; break) for i in [0..10]) 

它打破了編譯器,因爲你不能在列表解析使用break

我會建議在您最喜歡的編輯器中創建myfile.coffee並運行它(coffee myfile.coffee)而不是使用REPL。

+0

感謝您的詳細描述!但有一件事 - 我在* .coffee腳本編譯過程中遇到了這個錯誤,而且它並不總是相同的表達式,有時會編譯得很正常,有時不會。 第一次遇到它,我花了很多時間在代碼中搜索它發生的地方,因爲消息沒有行號。 – peko