我知道在REPL中使用分號作爲終止符。但是我很困惑什麼時候在源文件中使用它們。例如,val x = 1
之後不需要。但是如果我在use "foo.sml"
之後省略它,編譯器會抱怨它。什麼時候在SML中使用分號?
那麼,使用分號的規則是什麼?
我知道在REPL中使用分號作爲終止符。但是我很困惑什麼時候在源文件中使用它們。例如,val x = 1
之後不需要。但是如果我在use "foo.sml"
之後省略它,編譯器會抱怨它。什麼時候在SML中使用分號?
那麼,使用分號的規則是什麼?
分號用於SML中的一些語法實體。它們通常用於創建例如表達式或聲明的序列。這裏有一個鏈接到SML語法:
http://www.mpi-sws.org/~rossberg/sml.html
你的情況,你有興趣分號的聲明(該月類)。請注意,創建decs序列的分號是可選的。在編寫SML模塊時你從來不需要它,而且很少見到它們。例如
structure S = struct
val x = 5
fun f x = x
val z = x + x
end
不
structure S = struct
val x = 5;
fun f x = x;
val z = x + x
end
在源文件中,您通常使用一個分號分隔有副作用表達的唯一地方。例如,
val x = ref 5
val _ = (x := !x + 1; x := !x+ 2)
但這種用法很少見。
smlnj repl只會在看到分號時評估聲明,所以無論何時您想查看或使用該值,都應該使用分號。我認爲use "foo.sml";
的情況令人困惑,因爲它不是一個聲明;這是一個表達。我想像repl會將use "foo.sml"
這樣的表達轉換爲val _ = use "foo.sml"
。因此它需要分號來告訴repl真正運行它,如上所述。作爲一個便箋,use
沒有什麼特別的。它只是string -> unit
類型的函數。
謝謝。現在我知道爲什麼在聲明中沒有必要。然後你能解釋爲什麼需要在'use「foo.sml中使用';'?我仍然不理解它。 – Ben
我試圖澄清以上。 – seanmcl
+1對於SML語法參考。 –