标准ML是否支持Unicode?
我相信它没有,但找不到任何SML说明这样的权威文档.
是或否是所有需要,但你必须知道一个事实.没有猜测或我相信答案.权威链接会更好.
我有一个包含许多文件的项目,我希望它能与大多数流行的编译器一起使用.
不幸的是,PolyML和SML/NJ需要use语句,而MosML还需要使用loadpoly或sml无法识别的基础库结构.
最重要的是,MLton和MLKit需要一个完全不同的.mlb文件,只需列出文件名,并且还需要显式导入基础库,这是以与MosML不同的方式完成的:
$(SML_LIB)/basis/basis.mlb
Run Code Online (Sandbox Code Playgroud)
是否有一些标准的通用"包含此文件"命令,如果它不存在,是否有其他方法让所有编译器从一个入口点文件中读取?
PS不会介意有人对编译器差异进行小吵闹.我总是对人们的想法感兴趣,而且没有太多可用的信息:-)
我对 SML 完全陌生,我不明白我应该做什么才能使用 PolyML 创建、编辑、编译和运行 sml 文件。我使用的是 Windows,我不知道是否需要下载另一个 IDE,或者一些开发工具包(例如 Java)。
我想创建定义一些函数的文件,然后由终端使用它们。
我发现这polyml是可以在Ubuntu上轻松安装的ML的实现(在存储库中命名为polyml并且可以执行poly).我正在按照安德鲁·卡明的" A Gentle Introduction to ML".经过几分钟的polyml解释器实验后,我发现它不支持readline (按向上箭头键会产生^ [[A]).
对于口译员来说,这似乎不正常.这应该只在没有安装readline的情况下发生,但我的Python解释器不会这样做.
我正在尝试编译一串源代码并使用Poly/ML打印解析树.以下代码编译,但解析树为空:
fun main () =
let
val stream = TextIO.openString "let val a = \"abc\"; val b = \"def\"; val c = a ^ b in print c end";
val _ = PolyML.compiler (fn () => TextIO.input1 stream, []);
val (_, parseTree) = !PolyML.IDEInterface.parseTree
in
PolyML.print (parseTree);
PolyML.print (List.length parseTree);
List.map PolyML.print (parseTree);
()
end
Run Code Online (Sandbox Code Playgroud)
运行这个:
$ ./a.out
[...]
0
$
Run Code Online (Sandbox Code Playgroud)
从编译器获取解析树需要做什么?我还尝试使用CPCompilerResultFun编译器参数进行变体.但这也不起作用:
fun main () =
let
fun useTree (NONE, _) () =
(PolyML.print "not parsed"; ())
| …Run Code Online (Sandbox Code Playgroud) 我已从“PolyML5.6-64bit.msi”安装程序安装了 Poly/ML;我可以通过在“开始”菜单中单击 REPL 来启动它;但我不知道如何从中访问任何库?我尝试这样做use "something",但它会导致如下错误:
> use "Math";\nException-\n Io\n {cause = SysErr ("No such file or directory", SOME ENOENT), function =\n "TextIO.openIn", name = "Math"} raised\nRun Code Online (Sandbox Code Playgroud)\n\nuse "Basis"与或类似use "Windows"。
请注意,我对 SML 完全是新手;我似乎use在一些通用的 SML 教程中找到了该命令,但不知道我是否正确使用它:/
编辑:另外,目标安装目录似乎只包含以下三个二进制文件,不确定那里是否应该有一些源:
\n\nC:\\Program Files\\Poly ML>dir\n Volume in drive C is Windows\n Volume Serial Number is CENS-ORED\n\n Directory of C:\\Program Files\\Poly ML\n\n26.02.2016 00:03 <DIR> .\n26.02.2016 00:03 <DIR> ..\n25.01.2016 14:22 681\xc2\xa0472 PolyLib.dll\n25.01.2016 14:23 8\xc2\xa0182\xc2\xa0784 PolyML.exe\n25.01.2016 14:22 …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个测试函数来比较并显示错误消息,如果它们不相等:
exception AssertionErrorException of string
fun assert(testName, actual, expect) : bool =
if actual = expect
then true
else raise (AssertionErrorException (testName ^ " failed. actual: " ^ actual
^ ", expect: " ^ expect ));
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我用非字符串参数调用它,它就不起作用:
assert("test1", SOME [], NONE);
Run Code Online (Sandbox Code Playgroud)
它无法编译,错误信息是:
Error: operator and operand don't agree [tycon mismatch]
operator domain: string * string * string
operand: string * 'Z list option * 'Y option
in expression:
assert ("test1",SOME nil,NONE)
Run Code Online (Sandbox Code Playgroud)
怎么解决?
我最近注意到在函数声明中的函数名之前允许使用类型变量.但我看不出它是如何使用的.以下是使用它的一些示例:
Poly/ML 5.5.2 Release
> fun 'a print a = PolyML.print (a);
val print = fn: 'a -> 'a
> print "foo";
?
val it = "foo": string
> pint string "foo";
Error-Value or constructor (string) has not been declared
Found near print string "foo"
Static Errors
> string print "foo";
Error-Value or constructor (string) has not been declared
Found near string print "foo"
Static Errors
> val f : string -> string = print;
val f = fn: string …Run Code Online (Sandbox Code Playgroud) 到目前为止,我一直在几个小项目中使用 Poly/ML,其中所有源代码文件都位于同一目录中。要构建这些项目,我所要做的就是在 REPL 中运行以下命令:
> PolyML.make "Main";
Run Code Online (Sandbox Code Playgroud)
但现在我有一个项目,其规模使得将所有源代码文件放在同一目录中是不切实际的。要在 REPL 中构建这些项目,我需要运行以下命令:
> PolyML.make "foo/Foo";
> PolyML.make "bar/Bar";
> PolyML.make "qux/Qux";
> PolyML.make "Main";
Run Code Online (Sandbox Code Playgroud)
随着子系统数量的增加,这不太实用。
有没有什么方法可以自动化在 Poly/ML 中使用嵌套目录结构构建项目的过程?
PD:我看过 SML/NJ 的 Compilation Manager 和 MLton 的 ML Basis 系统。虽然毫无疑问功能强大,但它们对于我的需求来说太复杂了。
此代码不被接受;
> fun fact 0.0 = 1.0
Error-Real constants not allowed in patterns
> | fact n = n*fact(n-1);
Static Errors
Run Code Online (Sandbox Code Playgroud)
为什么是这样?