我知道在REPL中分号被用作终止符。但是我对于在源文件中何时使用它们感到困惑。
例如,在
那么,在使用分号方面有什么规则呢?
例如,在
val x = 1
后面不需要使用分号。但是如果我在use "foo.sml"
后省略它,编译器将抱怨。那么,在使用分号方面有什么规则呢?
在SML中,分号用于多种句法实体。通常用于创建表达式或声明的序列。这是SML语法的链接:
http://www.mpi-sws.org/~rossberg/sml.html
在您的情况下,您对声明使用的分号感兴趣(dec类)。请注意,创建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";
中需要吗?我还是不理解。 - Ben1+1
,我必须以分号结尾? - Ben1\n +\n 1;
。作为一个经验法则,在 repl 中想要查看结果时使用分号。 - seanmcl