2016-02-26 50 views
4

我已经从“PolyML5.6-64bit.msi”安装程序安装了Poly/ML;我可以通过在开始菜单中单击来启动REPL;但我不知道如何从它访问任何库?我尝试过做use "something",但它会导致这样的错误如下:如何在Windows上访问Poly/ML中的库?

> use "Math"; 
Exception- 
    Io 
    {cause = SysErr ("No such file or directory", SOME ENOENT), function = 
     "TextIO.openIn", name = "Math"} raised 

类似的use "Basis"use "Windows"

请注意,我是SML的总新手;我似乎已经找到了一些通用的SML教程use命令,如果我用它正确地根本不知道:/

编辑:另外,目标安装目录似乎只包含以下三个二进制文件,不知道是否应该有一些来源有,或没有:

C:\Program Files\Poly ML>dir 
Volume in drive C is Windows 
Volume Serial Number is CENS-ORED 

Directory of C:\Program Files\Poly ML 

26.02.2016 00:03 <DIR>   . 
26.02.2016 00:03 <DIR>   .. 
25.01.2016 14:22   681 472 PolyLib.dll 
25.01.2016 14:23   8 182 784 PolyML.exe 
25.01.2016 14:22   20 480 PolyPerf.dll 
       3 File(s)  8 884 736 bytes 

EDIT2:嗯...从一些进一步的浏览,我开始思考,显然保利/ ML似乎是used by most people purely from within"Isabelle IDE"?所以也许如果我安装这个,所有的都可以在盒子里工作?我会尽力,但现在仍然是最初的问题。

EDIT3:唔时,伊莎贝尔IDE是怪异,特别是不知道如何“运行”的SML文件,它反正开:/可能会卸载(?即删除)它在这种情况下,也考虑到事实上,我现在已经得到了原始问题的答案。

+0

在Windows中,我喜欢为SML使用textpad(http://textpad.com/index.html)。它不是IDE,但可以下载一个textpad sml语法定义文件,并为您的代码获取有用的语法高亮显示。在'use'命令中输入完整的路径名是很烦人的。我倾向于做的是在我的文件顶部有一个注释,它看起来像'(*使用“C:/Programs/SML/foo.sml”; *)',然后将注释的主体粘贴到SML中REPL当我想要加载定义。 –

回答

4

我在Linux上使用Poly/ML,而不是Windows。但我几乎可以肯定的是,在Windows上也是如此。

您不需要使用use函数来加载Basis Library的模块,这些模块在启动Poly/ML REPL时已经在顶层环境中。例如:

lolcathost% poly 
Poly/ML 5.6 Release 
> structure M = Math; 
structure M: MATH 
> M.pi; 
val it = 3.141592654: real 
> 

您可以使用use函数加载自己的代码。参数必须是绝对路径或相对于当前工作目录的路径。 我不知道是否可以更改REPL中的当前工作目录。 Check here了解如何更改当前工作目录,如果需要的话。

此外,对于较大的项目,您可能需要使用Poly/ML's make system而不是use


在回答您的评论:

模块PolyML.Compiler提供的功能来检索现有valuestypessignatures,在顶层环境structuresfunctors

但是,名字本身并不是非常有用。这里有一些技巧让REPL更多地告诉你。

类型:假设您想知道list的构造函数是什么。

> datatype foo = datatype list; 
datatype 'a foo = :: of 'a * 'a foo | nil 
> 

或者如何定义类型同义词StringCvt.reader

> datatype foo = datatype StringCvt.reader; 
type ('a, 'b) foo = 'b -> ('a * 'b) option 
> 

当然,如果你使用这种伎俩在一个抽象数据类型,你不会得到太多的信息:

> datatype foo = datatype string; 
eqtype foo 
> 

结构:说你想知道的价值和类型组件Byte是。

> structure Foo = struct open Byte end; 
structure Foo: 
    sig 
    val byteToChar: Word8.word -> char 
    val bytesToString: Word8Vector.vector -> string 
    val charToByte: char -> Word8.word 
    val packString: Word8Array.array * int * substring -> unit 
    val stringToBytes: string -> Word8Vector.vector 
    val unpackString: Word8ArraySlice.slice -> string 
    val unpackStringVec: Word8VectorSlice.slice -> string 
    end 
> 

签名:说你想知道什么签名​​的价值和类型组件。

> functor Foo (X : BYTE) = struct open X end; 
functor Foo (X: BYTE): 
    sig 
    val byteToChar: Word8.word -> char 
    val bytesToString: Word8Vector.vector -> string 
    val charToByte: char -> Word8.word 
    val packString: Word8Array.array * int * substring -> unit 
    val stringToBytes: string -> Word8Vector.vector 
    val unpackString: Word8ArraySlice.slice -> string 
    val unpackStringVec: Word8VectorSlice.slice -> string 
    end 
> 
+0

Ahhhh,确实有用,非常感谢!为了记录,它也适用于'结构W = Windows;',并且验证一个“消极情况”,'结构Q = Qwerty;'因为错误而失败。 这样说的话,如果我可能会提出一个额外的问题:是否可以列出所有“全局可用的模块/结构”和/或它们的内容,即例如“数学”中有什么? – akavel

+1

@akavel:标准基础库已在[这里]记录(http://sml-family.org/Basis/)。检查模块内容的另一种快速方法是使用'结构M = struct open Math end;'。 – pyon

+0

这个技巧非常有效,谢谢! :)但是,是否有可能使用它来查看“全球顶级环境”? (包括所有可用结构的列表?) – akavel