4

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

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

use "Basis"或类似use "Windows"

请注意,我是 SML 的新手;我似乎use在一些通用 SML 教程中找到了该命令,不知道我是否正确使用它:/

编辑:另外,目标安装目录似乎只包含以下三个二进制文件,不确定那里是否应该有一些源代码:

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

编辑2:嗯...从进一步浏览中,我开始认为显然 Poly/ML 似乎被大多数人纯粹从Isabelle IDE”中使用?所以也许如果我安装这个,一切都会开箱即用?我会尝试,但最初的问题现在仍然悬而未决。

编辑3:嗯,伊莎贝尔IDE很奇怪,特别是不知道如何“运行”在其中打开的SML文件:/在这种情况下可能会卸载(即删除?)它,同时考虑到我得到了答案现在已经回答了原来的问题。

4

1 回答 1

4

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

您不需要使用该use函数来加载基础库的模块,这些模块在您启动 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 中的当前工作目录。 如果需要,请在此处查看如何更改当前工作目录。

此外,对于较大的项目,您可能希望使用Poly/ML 的 make 系统而不是use.


回应您的评论:

PolyML.Compiler模块提供了检索顶级环境中现有类型签名结构和仿函数的名称的函数。

但是,仅这些名称并不是非常有用。这里有一些技巧可以让 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
> 

签名:假设您想知道签名的值和类型组件是什么BYTE

> 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
> 
于 2016-02-26T20:36:32.500 回答