2016-02-26 8 views
4

Я установил Poly/ML из установщика «PolyML5.6-64bit.msi»; Я могу запустить REPL, щелкнув его в меню «Пуск»; но я не знаю, как получить доступ к любым библиотекам из него? Я пытался делать use "something", но это приводит к ошибке, как показано ниже:Как получить доступ к библиотеке в Poly/ML в Windows?

> 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 

edit2: Ммм ... от некоторого дальнейшего просмотра, я начинаю думать, что, видимо Poly/ML кажется used by most people purely from within"Isabelle IDE"? так что, возможно, если я установлю этот, все будет работать из коробки? Я постараюсь, но до сих пор исходный вопрос остается открытым.

Edit3: Уххх, то Isabelle IDE не странно, а именно понятия не имею, как «Run» открыл файл SML в нем в любом случае: /, вероятно, собирается удалить (? Т.е. удалить) его в этой ситуации, а также с учетом факт, что я уже получил ответ на исходный вопрос.

+0

В Windows мне нравится использовать текстовую панель (http://textpad.com/index.html) для SML. Это не IDE, но вы можете скачать текстовый файл описания синтаксиса smbl и получить полезную подсветку синтаксиса для вашего кода. Ввод полного имени пути в команде 'use' вызывает раздражение. То, что я обычно делаю, - это комментарий в верхней части моих файлов, который выглядит примерно так: (* используйте «C: /Programs/SML/foo.sml»; *) ', а затем вставьте тело комментария в SML REPL, когда я хочу загрузить определения. –

ответ

4

Я использую Poly/ML для Linux, а не для 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. Check here, чтобы узнать, как изменить текущий рабочий каталог, если вам это нужно.

Кроме того, для больших проектов вы можете использовать Poly/ML's make system, а не use.


В ответ на ваш комментарий:

Модуль PolyML.Compiler обеспечивает функции для извлечения имена из существующих values, types, signatures, structures и functors в среде верхнего уровня.

Однако имена сами по себе не очень полезны. Вот несколько трюков, чтобы заставить 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 
> 
+0

Ahhhh, это действительно работает, спасибо большое! Для записи она работает и для структуры W = Windows; 'и для проверки« отрицательного случая »,' структура Q = Qwerty; 'с ошибкой. С учетом сказанного, еще один вопрос, если можно: можно ли перечислить все «глобально доступные модули/структуры» и/или их содержимое, то есть, например, что есть в «Математике»? – akavel

+1

@akavel: стандартная базовая библиотека документирована [здесь] (http://sml-family.org/Basis/). Еще один быстрый способ проверить содержимое модуля - использовать структуру M = struct open Math end; '. – pyon

+0

Трюк работает великолепно, спасибо! :) Тем не менее, можно ли использовать его для просмотра «глобальной среды верхнего уровня»? (включая список всех доступных структур?) – akavel