2013-10-08 40 views
12

REPL'de noktalı virgüllerin sonlandırıcı olarak kullanıldığını biliyorum. Ama onları bir kaynak dosyada kullanmam konusunda kafam karıştı. Örneğin val x = 1'dan sonra gerekli değildir. Ama use "foo.sml"'dan sonra atlarsam, derleyici bundan şikayet eder.SML'de noktalı virgül ne zaman kullanılır?

Sonra, noktalı virgül kullanma kuralları nelerdir?

cevap

11

Semicolons, SML'de bir dizi sözdizim öğesi için kullanılır. Bunlar normal olarak, örneğin, ifadeler veya beyanlar dizileri oluşturmak için kullanılır. İşte SML dilbilgisi için bir bağlantı:

http://www.mpi-sws.org/~rossberg/sml.html

sizin durumda, bildirimleri için noktalı virgül (Aralık sınıfı) ilgileniyor. Bir aralık dizisi oluşturan noktalı virgülün isteğe bağlı olduğunu unutmayın. SML modülleri yazarken aslında ona hiç ihtiyacınız yok ve onları görmek nadirdir. Örneğin

kaynağı dosyasında değil

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 

, normalde bir noktalı virgül yan etkilere sahip ifadeler ayıran kullanmak tek yer için. Örneğin,

Ancak bu kullanım nadirdir.

smlnj repl, bir noktalı virgül görse bile yalnızca bildirimleri değerlendirir, bu nedenle değeri görmek veya oynatmak istediğinizde noktalı virgül kullanmalısınız. Sanırım use "foo.sml"; davası kafa karıştırıcı, çünkü bu bir deklarasyon değil; bu bir ifade. Bu repleksin use "foo.sml" gibi ifadeleri val _ = use "foo.sml"'a dönüştürdüğünü hayal ediyorum. Bu nedenle, yukarıdaki gibi, gerçekten çalıştırmak için replise söylemek için noktalı virgül gerekiyor. Bir yan not olarak, use hakkında özel bir şey yoktur. Bu sadece string -> unit tipinin bir fonksiyonudur.

+0

Teşekkürler. Şimdi beyanlarda neden gerekli olmadığını biliyorum. Ve sonra neden "foo.sml", "kullanımı" nda gerekli olduğunu açıklayabilir misiniz? Hala anladım. – Ben

+0

Yukarıda açıklığa kavuşturmaya çalıştım. – seanmcl

+0

+1 SML dilbilgisi başvurusu için. –