Spec-Zone.ru › OCaml
☰Инструменты OCaml
  • Партиционная компиляция (ocamlc)
  • Система верхнего уровня или REPL (ocaml)
  • Система выполнения (ocamlrun)
  • Компиляция натив-кода (ocamlopt)
  • Генераторы лексических и синтаксических анализаторов (ocamllex, ocamlyacc)
  • Генератор зависимостей (ocamldep)
  • Генератор документации (ocamldoc)
  • Отладчик (ocamldebug)
  • Профилирование (ocamlprof)
  • Интерфейсы C с OCaml
  • Оптимизация с Flambda
  • Fuzzing с afl-fuzz
  • Отслеживание выполнения с помощью событий runtime
  • Преобразование программы «Хвост Модуль Конструктор»
  • Обнаружение гонок данных во время выполнения с помощью ThreadSanitizer

Глава 14 Система верхнего уровня или REPL (ocaml)

В этой главе описывается ocaml, система верхнего уровня для OCaml, которая позволяет интерактивно использовать систему OCaml через цикл чтения-вычисления-печати (REPL). В этом режиме система многократно считывает фрагменты OCaml из входного потока, затем выполняет проверку типов, компиляцию и вычисление, затем печатает выведенный тип и значение результата, если таковое имеется. Конец файла во входном потоке стандартного ввода завершает работу ocaml.

Вход в систему верхнего уровня может занимать несколько строк. Он начинается после приглашения # (символ диеза), напечатанного системой, и завершается ;; (двойной точкой с запятой), за которым следует необязательное пробельное пространство, комментарии и конец строки. Вход в систему верхнего уровня состоит из одной или нескольких фраз верхнего уровня со следующим синтаксисом:

ввод-верхнего-уровня ::= { определение } ;;
∣ выражение ;;
∣ # идентификатор [ аргумент-директивы ] ;;
аргумент-директивы ::= строковая-литерал
∣ целочисленная-литерал
∣ путь-к-значению
∣ true ∣ false

Фраза может состоять из последовательности определений, аналогичных тем, которые встречаются в реализациях единиц компиляции или в выражениях модуля struct … end. Определения могут связывать имена значений, имена типов, исключения, имена модулей или имена типов модулей. Система верхнего уровня выполняет привязку, затем печатает типы и значения (если таковые имеются) для определенных имен.

Фраза также может состоять из выражения значения (раздел ‍11.7). Оно просто вычисляется без выполнения каких-либо привязок, и его значение печатается.

Наконец, фраза также может состоять из директивы верхнего уровня, начинающейся с # (знак диеза). Эти директивы управляют поведением системы верхнего уровня; они перечислены ниже в разделе ‍14.2.

Unix: Система верхнего уровня запускается командой ocaml, как следует:
        ocaml options objects                # interactive mode
        ocaml options objects scriptfile        # script mode
параметры описаны ниже. объекты — имена файлов, заканчивающиеся на .cmo или .cma; они загружаются в интерпретатор сразу после установки параметров. имя_скрипта — любое имя файла, не заканчивающееся на .cmo или .cma.

Если в командной строке не указано имя_скрипта, система верхнего уровня переходит в интерактивный режим: фразы считываются со стандартного ввода, результаты печатаются на стандартный вывод, ошибки — на стандартный вывод ошибок. Конец файла в стандартном вводе завершает работу ocaml (см. также директиву #quit в разделе ‍14.2).

При запуске (до чтения первой фразы) содержимое файла инициализации считывается как последовательность фраз OCaml и выполняется в соответствии с директивой #use, описанной в разделе ‍14.2. Коды завершения вычислений каждой фразы не отображаются.

Файл инициализации — это первый найденный из:

  1. .ocamlinit в текущем каталоге;
  2. XDG_CONFIG_HOME/ocaml/init.ml, если XDG_CONFIG_HOME — абсолютный путь;
  3. в противном случае, в Unix, HOME/ocaml/init.ml или в Windows, ocaml\init.ml в LocalAppData (например, C:\Users\Bactrian\AppData\Local\ocaml\init.ml);
  4. ocaml/init.ml в любом из абсолютных путей в XDG_CONFIG_DIRS. Пути в XDG_CONFIG_DIRS разделены двоеточием в Unix и точкой с запятой в Windows;
  5. если XDG_CONFIG_DIRS не содержал абсолютных путей, /usr/xdg/ocaml/init.ml в Unix или, ocaml\init.ml в любом из LocalAppData (например, C:\Users\Bactrian\AppData\Local), RoamingAppData (например, C:\Users\Bactrian\AppData\Roaming) или ProgramData (например, C:\ProgramData) в Windows;
  6. HOME/.ocamlinit, если HOME не пусто;

Система верхнего уровня не выполняет редактирование строк, но ее можно легко использовать совместно с внешним редактором строк, таким как ledit или rlwrap. Также доступен улучшенный верхний уровень, utop. Еще один вариант — использовать ocaml под Gnu Emacs, который предоставляет полные возможности редактирования Emacs (команда run-caml из библиотеки inf-caml).

В любой момент разбор, компиляция или вычисление текущей фразы могут быть прерваны нажатием клавиши ctrl-C (или, точнее, отправкой сигнала INTR процессу ocaml). Затем верхний уровень сразу возвращается к приглашению #.

Если в командной строке ocaml указано имя_скрипта, система верхнего уровня переходит в режим выполнения скрипта: содержимое файла считывается как последовательность фраз OCaml и выполняется в соответствии с директивой #use (раздел ‍14.2). Результат вычисления не печатается. По достижении конца файла команда ocaml выходит сразу. Команды не считываются со стандартного ввода. Sys.argv преобразуется, игнорируя все параметры OCaml, начиная с имени файла скрипта в Sys.argv.(0).

В режиме выполнения скрипта первая строка скрипта игнорируется, если она начинается с #!. Таким образом, скрипт можно сделать исполняемым и поместить в первую строку #!/usr/local/bin/ocaml, что вызовет систему верхнего уровня автоматически при запуске скрипта. Однако ocaml сам является скриптом #! на большинстве установок OCaml, и ядра Unix обычно не обрабатывают вложенные скрипты #!. Лучшее решение — поместить следующую строку в первую строку скрипта:

        #!/usr/local/bin/ocamlrun /usr/local/bin/ocaml

1 Параметры

Следующие параметры командной строки распознаются командой ocaml.

-absname
Выводить сообщения об ошибках с абсолютными путями к файлам.
-no-absname
Не пытаться отображать абсолютные имена файлов в сообщениях об ошибках.
-args filename
Считывать дополнительные аргументы командной строки, завершённые символом новой строки, из файла filename. Невозможно передать файл scriptfile в качестве аргумента верхнему уровню.
-args0 filename
Считывать дополнительные аргументы командной строки, завершённые нулём, из файла filename. Невозможно передать файл scriptfile в качестве аргумента верхнему уровню.
-I directory
Добавить указанную директорию в список директорий, просматриваемых при поиске исходных и скомпилированных файлов. По умолчанию, сначала проверяется текущая директория, затем стандартная директория библиотеки. Директории, добавленные с помощью -I, проверяются после текущей директории в порядке их указания в командной строке, но перед стандартной директорией библиотеки. См. также опцию -nostdlib.

Если указанная директория начинается с +, она рассматривается относительно стандартной директории библиотеки. Например, -I +unix добавляет поддиректорию unix стандартной библиотеки в путь поиска.

Директории также могут быть добавлены в список после запуска верхнего уровня с директивой #directory (раздел ‍14.2).

-init file
Загрузить указанный файл вместо файла инициализации по умолчанию. Файл инициализации по умолчанию — это первый из найденных:
  1. .ocamlinit в текущей директории;
  2. XDG_CONFIG_HOME/ocaml/init.ml, если XDG_CONFIG_HOME — абсолютный путь;
  3. в противном случае, в Unix, HOME/ocaml/init.ml или, в Windows, ocaml\init.ml в LocalAppData (например, C:\Users\Bactrian\AppData\Local\ocaml\init.ml);
  4. ocaml/init.ml в любом из абсолютных путей в XDG_CONFIG_DIRS. Пути в XDG_CONFIG_DIRS разделены двоеточием в Unix и точкой с запятой в Windows;
  5. если XDG_CONFIG_DIRS не содержат абсолютных путей, /usr/xdg/ocaml/init.ml в Unix или ocaml\init.ml в любой из папок LocalAppData (например, C:\Users\Bactrian\AppData\Local), RoamingAppData (например, C:\Users\Bactrian\AppData\Roaming) или ProgramData (например, C:\ProgramData) в Windows;
  6. HOME/.ocamlinit, если HOME не пусто;
-labels
Метки не игнорируются в типах, метки могут использоваться в приложениях, и помеченные параметры могут быть указаны в любом порядке. Это значение по умолчанию.
-no-app-funct
Деактивирует прикладное поведение функторов. С этой опцией каждое применение функтора генерирует новые типы в результате, и применение того же функтора дважды к одному аргументу даёт две несовместимые структуры.
-noassert
Не компилировать проверки утверждений. Обратите внимание, что специальная форма assert false всегда компилируется, потому что она имеет специальный тип.
-nolabels
Игнорировать необязательные метки в типах. Метки не могут использоваться в приложениях, и порядок параметров становится жёстким.
-noprompt
Не отображать приглашение при ожидании ввода.
-nopromptcont
Не отображать дополнительное приглашение при ожидании продолжения ввода многострочных строк. Это следует использовать, например, при запуске ocaml в окне emacs.
-nostdlib
Не включать стандартную директорию библиотеки в список директорий, проверяемых при поиске исходных и скомпилированных файлов.
-ppx command
После разбора, передать абстрактное синтаксическое дерево в препроцессор command. Модуль Ast_mapper, описанный в главе ‍30: Ast_mapper , реализует внешний интерфейс препроцессора.
-principal
Проверять пути информации во время проверки типов, чтобы убедиться, что все типы выводятся основным способом. При использовании помеченных аргументов и/или полиморфных методов этот флаг необходим для обеспечения того, что будущие версии компилятора смогут корректно выводить типы, даже если внутренние алгоритмы изменятся. Все программы, принятые в режиме -principal, также принимаются в режиме по умолчанию с эквивалентными типами, но различными двоичными сигнатурами, и это может замедлить проверку типов; тем не менее, это хорошая идея использовать её один раз перед публикацией исходного кода.
-rectypes
Разрешить произвольные рекурсивные типы во время проверки типов. По умолчанию поддерживаются только рекурсивные типы, где рекурсия проходит через тип объекта.
-safe-string
Обеспечить разделение между типами string и bytes, тем самым сделав строки неизменяемыми. Это значение по умолчанию и используется с версии OCaml 5.0.
-safer-matching
Не использовать информацию о типе для оптимизации сопоставления с образцом. Это позволяет обнаруживать ошибки совпадения, даже если сопоставление с образцом неправильно считается исчерпывающим. Это затрагивает только компиляцию GADT и полиморфных вариантов.
-short-paths
Когда тип виден под несколькими модульными путями, используйте кратчайший из них при печати имени типа в выведенных интерфейсах, сообщениях об ошибках и предупреждениях. Имена идентификаторов, начинающиеся с нижнего подчёркивания _ или содержащие двойные подчёркивания __, вносят штраф +10 при вычислении их длины.
-stdin
Считать стандартный ввод как файл сценария вместо запуска интерактивной сессии.
-strict-sequence
Заставить левую часть каждой последовательности иметь тип unit.
-strict-formats
Отклонять недопустимые форматы, которые принимались в устаревших реализациях форматов. Вы должны использовать этот флаг для обнаружения и исправления таких недопустимых форматов, поскольку они будут отклоняться будущими версиями OCaml.
-unsafe
Отключить проверку границ для доступа к массивам и строкам (конструкции v.(i) и s.[i]). Программы, скомпилированные с -unsafe, поэтому быстрее, но небезопасны: может произойти всё, если программа обращается к массиву или строке за пределами его границ.
-unsafe-string
Определите типы string и bytes, тем самым сделав строки изменяемыми. Это предназначено для совместимости со старым исходным кодом и не должно использоваться с новым программным обеспечением. Этот параметр вызывает ошибку безусловно начиная с OCaml 5.0.
-v
Вывести номер версии компилятора и расположение каталога стандартной библиотеки, затем завершить работу.
-verbose
Вывести все внешние команды перед их выполнением. Полезно для отладки проблем с библиотеками C.
-version
Вывести строку версии и завершить работу.
-vnum
Вывести короткий номер версии и завершить работу.
-no-version
Не выводить баннер версии при запуске.
-w warning-list
Включить, отключить или пометить как фатальные предупреждения, указанные в аргументе warning-list. Каждое предупреждение может быть включено или выключено, а также фатальным или не фатальным. Если предупреждение отключено, оно не отображается и никак не влияет на компиляцию (даже если оно фатальное). Если предупреждение включено, оно обычно отображается компилятором всякий раз, когда исходный код его вызывает. Если оно включено и фатальное, компилятор также остановится с ошибкой после его отображения.

Аргумент warning-list представляет собой последовательность спецификаторов предупреждений без разделителей между ними. Спецификатор предупреждения — это одно из следующего:

+num
Включить предупреждение номер num.
-num
Отключить предупреждение номер num.
@num
Включить и пометить как фатальное предупреждение номер num.
+num1..num2
Включить предупреждения в заданном диапазоне.
-num1..num2
Отключить предупреждения в заданном диапазоне.
@num1..num2
Включить и пометить как фатальные предупреждения в заданном диапазоне.
+letter
Включить набор предупреждений, соответствующих letter. Буква может быть заглавной или строчной.
-letter
Отключить набор предупреждений, соответствующих letter. Буква может быть заглавной или строчной.
@letter
Включить и пометить как фатальные набор предупреждений, соответствующих letter. Буква может быть заглавной или строчной.
uppercase-letter
Включить набор предупреждений, соответствующих uppercase-letter.
lowercase-letter
Отключить набор предупреждений, соответствующих lowercase-letter.

В качестве альтернативы warning-list может указать одно предупреждение с помощью его мнемонического имени (см. ниже), как показано ниже:

+name
Включить предупреждение name.
-name
Отключить предупреждение name.
@name
Включить и пометить как фатальное предупреждение name.

Номера предупреждений, буквы и имена, которые в настоящее время не определены, игнорируются. Предупреждения следующие (имя после каждого номера указывает мнемонику для этого предупреждения).

1 comment-start
Подозрительная метка начала комментария.
2 comment-not-end
Подозрительная метка конца комментария.
3
Устаревшее синоним для предупреждения ’deprecated’.
4 fragile-match
Хрупкое сопоставление шаблонов: соответствие, которое останется полным, даже если к одному из типов вариантов, с которыми сравнивается, будут добавлены дополнительные конструкторы.
5 ignored-partial-application
Частично примененная функция: выражение, результат которого имеет тип функции и игнорируется.
6 labels-omitted
Метка опущена в применении функции.
7 method-override
Метод перезаписан.
8 partial-match
Частичное соответствие: отсутствующие случаи в сопоставлении шаблонов.
9 missing-record-field-pattern
Отсутствующие поля в шаблоне записи.
10 non-unit-statement
Выражение в левой части последовательности, у которого нет типа unit (и которое не является функцией, см. предупреждение номер 5).
11 redundant-case
Избыточный случай в сопоставлении шаблонов (неиспользуемый случай соответствия).
12 redundant-subpat
Избыточный подшаблон в сопоставлении шаблонов.
13 instance-variable-override
Переопределён переменная экземпляра.
14 illegal-backslash
Неправильный обратный слэш в строковой константе.
15 implicit-public-methods
Приватный метод неявно сделан публичным.
16 unerasable-optional-argument
Неудаляемый необязательный аргумент.
17 undeclared-virtual-method
Необъявленный виртуальный метод.
18 not-principal
Неглавный тип.
19 non-principal-labels
Тип без принципиальности.
20 ignored-extra-argument
Неиспользуемый аргумент функции.
21 nonreturning-statement
Невозвращающее выражение.
22 preprocessor
Предупреждение препроцессора.
23 useless-record-with
Бесполезная запись with части.
24 bad-module-name
Неправильное имя модуля: имя исходного файла не является допустимым именем модуля OCaml.
25
Проигнорировано: теперь часть предупреждения 8.
26 unused-var
Подозрительная неиспользуемая переменная: неиспользуемая переменная, связанная с let или as и не начинающаяся с символа подчёркивания (_).
27 unused-var-strict
Безобидная неиспользуемая переменная: неиспользуемая переменная, которая не связана с let ни с as и не начинается с символа подчёркивания (_).
28 wildcard-arg-to-constant-constr
Дикий шаблон, данный как аргумент константного конструктора.
29 eol-in-string
Неэкранированный конец строки в строковой константе (непереносимый код).
30 duplicate-definitions
Два метки или конструктора с одинаковым именем определены в двух взаимно рекурсивных типах.
31 module-linked-twice
Модуль связан дважды в одной исполняемой программе.
I
Игнорируется: теперь жёсткая ошибка (с версии 5.1).
32 unused-value-declaration
Неиспользуемое объявление значения. (с версии 4.00)
33 unused-open
Неиспользуемое оператор open. (с версии 4.00)
34 unused-type-declaration
Неиспользуемое объявление типа. (с версии 4.00)
35 unused-for-index
Неиспользуемый индекс цикла for. (с версии 4.00)
36 unused-ancestor
Неиспользуемый предковый переменная. (с версии 4.00)
37 unused-constructor
Неиспользуемый конструктор. (с версии 4.00)
38 unused-extension
Неиспользуемый расширенный конструктор. (с версии 4.00)
39 unused-rec-flag
Неиспользуемый флаг rec. (с версии 4.00)
40 name-out-of-scope
Имя конструктора или метки использовано вне области видимости. (с версии 4.01)
41 ambiguous-name
Размытое имя конструктора или метки. (с версии 4.01)
42 disambiguated-name
Ясность имени конструктора или метки (предупреждение совместимости). (с версии 4.01)
43 nonoptional-label
Необязательная метка применена как необязательная. (с версии 4.01)
44 open-shadow-identifier
Оператор open затеняет уже определённый идентификатор. (с версии 4.01)
45 open-shadow-label-constructor
Оператор open затеняет уже определённую метку или конструктор. (с версии 4.01)
46 bad-env-variable
Ошибка в переменной среды. (с версии 4.01)
47 attribute-payload
Некорректная нагрузка атрибута. (с версии 4.02)
48 eliminated-optional-arguments
Неявное удаление необязательных аргументов. (с версии 4.02)
49 no-cmi-file
Отсутствует файл cmi при поиске псевдонима модуля. (с версии 4.02)
50 unexpected-docstring
Неожиданный комментарий в документации. (с версии 4.03)
51 wrong-tailcall-expectation
Вызов функции с неправильным атрибутом @tailcall. (с версии 4.03)
52 fragile-literal-pattern (см. 13.5.3)
Хрупкий шаблон констант. (с версии 4.03)
53 misplaced-attribute
Атрибут не может быть использован в данном контексте. (с версии 4.03)
54 duplicated-attribute
Атрибут использован более одного раза в выражении. (с версии 4.03)
55 inlining-impossible
Внедрение невозможно. (с версии 4.03)
56 unreachable-case
Недостижимый случай в соответствии с шаблоном (на основе информации о типе). (с версии 4.03)
57 ambiguous-var-in-pattern-guard (см. 13.5.4)
Неоднозначные переменные в шаблонах с условиями. (с версии 4.03)
58 no-cmx-file
Отсутствует файл cmx. (с версии 4.03)
59 flambda-assignment-to-non-mutable-value
Присваивание неизменяемому значению. (с версии 4.03)
60 unused-module
Неиспользуемое объявление модуля. (с версии 4.04)
61 unboxable-type-in-prim-decl
Тип, который нельзя разложить, в примитивном объявлении. (с версии 4.04)
62 constraint-on-gadt
Ограничение типа на объявление GADT. (с версии 4.06)
63 erroneous-printed-signature
Некорректная напечатанная сигнатура. (с версии 4.08)
64 unsafe-array-syntax-without-parsing
-unsafe используется с препроцессором, возвращающим дерево синтаксического анализа. (с версии 4.08)
65 redefining-unit
Объявление типа, определяющее новый конструктор '()'. (с версии 4.08)
66 unused-open-bang
Неиспользуемое оператор open!. (с версии 4.08)
67 unused-functor-parameter
Неиспользуемый параметр функтора. (с версии 4.10)
68 match-on-mutable-state-prevent-uncurry
Сопоставление с образцом, зависящее от изменяемого состояния, предотвращает разворачивание оставшихся аргументов. (с версии 4.12)
69 unused-field
Неиспользуемое поле записи. (с версии 4.13)
70 missing-mli
Отсутствует файл интерфейса. (с версии 4.13)
71 unused-tmc-attribute
Неиспользуемый атрибут @tail_mod_cons. (с версии 4.14)
72 tmc-breaks-tailcall
С помощью преобразования @tail_mod_cons хвостовой вызов превращается в не-хвостовой вызов. (с версии 4.14)
73 generative-application-expects-unit
Генеративный функтор применяется к пустой структуре (конец структуры) вместо (). (с версии 5.1)
A
все предупреждения
C
предупреждения 1, 2.
D
Псевдоним для предупреждения 3.
E
Псевдоним для предупреждения 4.
F
Псевдоним для предупреждения 5.
K
предупреждения 32, 33, 34, 35, 36, 37, 38, 39.
L
Псевдоним для предупреждения 6.
M
Псевдоним для предупреждения 7.
P
Псевдоним для предупреждения 8.
R
Псевдоним для предупреждения 9.
S
Псевдоним для предупреждения 10.
U
предупреждения 11, 12.
V
Псевдоним для предупреждения 13.
X
предупреждения 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 30.
Y
Псевдоним для предупреждения 26.
Z
Псевдоним для предупреждения 27.

Значение по умолчанию — -w +a-4-6-7-9-27-29-32..42-44-45-48-50-60. Оно отображается с помощью -help. Обратите внимание, что предупреждения 5 и 10 не всегда срабатывают, в зависимости от внутренней работы проверяющего типа.

-warn-error warning-list
Отметить как фатальные предупреждения, указанные в аргументе warning-list. Компилятор завершится с ошибкой, когда будет выведено одно из этих предупреждений. warning-list имеет то же значение, что и для опции -w: знак + (или заглавная буква) отмечает соответствующие предупреждения как фатальные, знак - (или строчная буква) возвращает их к не-фатальным предупреждениям, а знак @ одновременно включает и отмечает соответствующие предупреждения как фатальные.

Примечание: не рекомендуется использовать наборы предупреждений (т.е. буквы) в качестве аргументов для -warn-error в коде производства, так как это может нарушить сборку при добавлении новых предупреждений в будущих версиях OCaml.

Значение по умолчанию — -warn-error -a (никакое предупреждение не является фатальным).

-warn-help
Отобразить описание всех доступных номеров предупреждений.
- file
Использовать file в качестве имени файла скрипта, даже если оно начинается с тире (-).
-help or --help
Отобразить краткое описание использования и выйти.
Unix: Следующие переменные окружения также используются:
OCAMLTOP_INCLUDE_PATH
Дополнительные каталоги для поиска скомпилированных файлов объектного кода (.cmi, .cmo и .cma). Указанные каталоги рассматриваются слева направо после поиска каталогов включения, заданных в командной строке через -I. Доступно начиная с OCaml 4.08.
OCAMLTOP_UTF_8
При выводе значений строк, байты, не являющиеся ASCII ( > \0x7E ), выводятся как десятичные escape-последовательности, если OCAMLTOP_UTF_8 установлено в false. В противном случае они выводятся без экранирования.
TERM
При выводе сообщений об ошибках, система toplevel пытается визуально подчеркнуть местоположение ошибки. Она использует переменную TERM для определения типа терминала вывода и поиска его возможностей в базе данных терминалов.
XDG_CONFIG_HOME, HOME, XDG_CONFIG_DIRS
Процедура поиска файла инициализации (см. выше).

2 Директивы toplevel

Следующие директивы управляют поведением toplevel, загружают файлы в память и отслеживают выполнение программы.

Примечание: все директивы начинаются с символа # (sharp). Этот символ # должен быть напечатан перед директивой и не следует путать с приглашением #, отображаемым интерактивным циклом. Например, ввод #quit;; выведет из цикла toplevel, но ввод quit;; приведет к ошибке «неизвестное значение quit».

Общие
#help;;
Выводит список всех доступных директив, включая соответствующий тип аргумента, если применимо.
#quit;;
Выход из цикла верхнего уровня и завершение команды ocaml.
Загрузка кода
#cd "имя_каталога";;
Изменение текущего каталога.
#directory "имя_каталога";;
Добавление указанного каталога в список каталогов, проверяемых при поиске исходных и скомпилированных файлов.
#remove_directory "имя_каталога";;
Удаление указанного каталога из списка каталогов, проверяемых при поиске исходных и скомпилированных файлов. Ничего не делает, если данный каталог в списке отсутствует.
#load "имя_файла";;
Загрузка в память файла байткода (.cmo файл) или библиотечного файла (.cma файл), сгенерированных компилятором ocamlc.
#load_rec "имя_файла";;
Загрузка в память файла байткода (.cmo файл) или библиотечного файла (.cma файл), сгенерированных компилятором ocamlc. При загрузке файла объекта, который зависит от других модулей, ещё не загруженных, также будут ищется и загружены файлы .cmo для этих модулей рекурсивно. Порядок загрузки не определён.
#use "имя_файла";;
Чтение, компиляция и выполнение исходных фраз из заданного файла. Это текстовая вставка: фразы обрабатываются так, как если бы они были введены со стандартного ввода. Чтение файла прекращается при первой возникшей ошибке.
#use_output "команда";;
Выполнение команды и оценка её вывода как будто он был перенаправлен в файл и передан в #use.
#mod_use "имя_файла";;
Аналогично #use, но также оборачивает код в модуль верхнего уровня с тем же именем, что и файл (заглавными буквами без расширения), следуя семантике компилятора.

Для директив, принимающих имена файлов в качестве аргументов, если указанное имя файла не определяет каталог, файл ищется в следующих каталогах:

  1. В режиме скрипта, каталог, содержащий выполняемый скрипт; в интерактивном режиме, текущий рабочий каталог.
  2. Каталоги, добавленные с помощью директивы #directory.
  3. Каталоги, указанные в командной строке с помощью опций -I.
  4. Каталог стандартной библиотеки.
Запросы к окружению
#show_class путь_к_классу;;
#show_class_type путь_к_классу;;
#show_exception идентификатор;;
#show_module путь_к_модулю;;
#show_module_type путь_к_типу_модуля;;
#show_type тип_константы;;
#show_val путь_к_значению;;
Вывод сигнатуры соответствующего компонента.
#show идентификатор;;
Вывод сигнатур компонентов с именем идентификатор во всех вышеперечисленных категориях.
Красивая печать
#install_printer имя_функции_вывода;;
Данная директива регистрирует функцию с именем имя_функции_вывода (путь к значению) как функцию вывода для значений, тип которых соответствует типу аргумента функции. То есть, цикл верхнего уровня вызовет имя_функции_вывода, когда он имеет такое значение для печати.

Функция вывода имя_функции_вывода должна иметь тип Format.formatter -> t -> unit, где t — тип значений, которые нужно напечатать, и должна выводить текстовое представление значения типа t на заданном форматировщике, используя функции библиотеки Format. Для обратной совместимости, имя_функции_вывода также может иметь тип t -> unit и затем выводить на стандартный форматировщик, но это использование устарело.

#print_depth n;;
Ограничение печати значений максимальной глубиной n. Части значений, глубина которых превышает n, выводятся как ... (многоточие).
#print_length n;;
Ограничение количества печатаемых узлов значения до n. Остальные части значений выводятся как ... (многоточие).
#remove_printer имя_функции_вывода;;
Удаление указанной функции из таблицы принтеров верхнего уровня.
Отладка
#trace имя_функции;;
После выполнения этой директивы, все вызовы функции с именем имя_функции будут «отлаживаться». То есть, аргумент и результат отображаются для каждого вызова, а также исключения, выходящие из функции, поднятые либо самой функцией, либо другой функцией, которую она вызывает. Если функция является каррированной, каждый аргумент печатается при его передаче в функцию.
#untrace имя_функции;;
Остановка отладки указанной функции.
#untrace_all;;
Остановка отладки всех ранее отлаживаемых функций.
Опции компилятора
#debug bool;;
Включить/выключить вставку отладочных событий. По умолчанию true.
#labels bool;;
Игнорировать метки в типах функций, если аргумент false, или переключиться обратно на стандартное поведение (стиль коммутации), если аргумент true.
#ppx "file-name";;
После парсинга, передать абстрактное синтаксическое дерево через команду препроцессора.
#principal bool;;
Если аргумент true, проверять пути информации во время проверки типов, чтобы убедиться, что все типы получены главным образом. Если аргумент false, не проверять пути информации.
#rectypes;;
Разрешить произвольные рекурсивные типы во время проверки типов. Примечание: после включения этот параметр нельзя отключить, так как это приведёт к некорректности системы типов.
#warn_error "warning-list";;
Обрабатывать как ошибки предупреждения, включённые аргументом, и как обычные предупреждения – предупреждения, отключённые аргументом.
#warnings "warning-list";;
Включать или отключать предупреждения в соответствии с аргументом.

3 Верхний уровень и система модулей

Фразы верхнего уровня могут ссылаться на идентификаторы, определённые в единицах компиляции, с теми же механизмами, что и для отдельно компилируемых единиц: либо с помощью квалифицированных имён (Modulename.localname), либо с помощью конструкции open и неквалифицированных имён (см. раздел ‍11.3).

Однако, прежде чем ссылаться на другую единицу компиляции, реализация этой единицы должна быть присутствовать в памяти. При запуске система верхнего уровня содержит реализации всех модулей в стандартной библиотеке. Реализации пользовательских модулей могут быть введены с помощью директивы #load, описанной выше. Ссылка на единицу, для которой не предоставлена реализация, приводит к ошибке Ссылка на неопределённую глобальную переменную `...'.

Обратите внимание, что ввод open Mod просто предоставляет доступ к скомпилированному интерфейсу (.cmi файл) для Mod, но не загружает реализацию Mod и не вызывает ошибок, если реализация Mod не загружена. Ошибка «ссылка на неопределённую глобальную переменную Mod» возникнет только при выполнении значения или определения модуля, ссылающегося на Mod.

4 Распространённые ошибки

В этом разделе описаны и объяснены наиболее часто встречающиеся сообщения об ошибках.

Файл filename не найден
Имя файла не найдено ни в текущем каталоге, ни в каталогах пути поиска.

Если filename имеет формат mod.cmi, это означает, что вы сослались на единицу компиляции mod, но её скомпилированный интерфейс не был найден. Исправление: сначала скомпилируйте mod.mli или mod.ml для создания скомпилированного интерфейса mod.cmi.

Если filename имеет формат mod.cmo, это означает, что вы пытаетесь загрузить с помощью #load файл байткода, который ещё не существует. Исправление: сначала скомпилируйте mod.ml.

Если ваша программа охватывает несколько каталогов, эта ошибка также может появиться, потому что вы не указали каталоги для поиска. Исправление: используйте директиву #directory для добавления правильных каталогов в путь поиска.

Это выражение имеет тип t1, но используется с типом t2
См. раздел ‍13.4.
Ссылка на неопределённую глобальную переменную mod
Вы не загрузили в память реализацию модуля с помощью #load. См. раздел ‍14.3 выше.

5 Создание пользовательских систем верхнего уровня: ocamlmktop

Команда ocamlmktop создаёт системы OCaml верхнего уровня, содержащие пользовательский код, предварительно загруженный при запуске.

Команда ocamlmktop принимает в качестве аргумента набор файлов .cmo и .cma и связывает их с объектными файлами, реализующими систему OCaml верхнего уровня. Типичное использование:

        ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo

Это создаёт байткодовый файл mytoplevel, содержащий систему OCaml верхнего уровня, плюс код из трёх файлов .cmo. Этот верхний уровень непосредственно исполняемый и запускается:

        ./mytoplevel

Это запускает обычный цикл верхнего уровня, за исключением того, что код из foo.cmo, bar.cmo и gee.cmo уже загружен в память, как будто вы ввели:

        #load "foo.cmo";;
        #load "bar.cmo";;
        #load "gee.cmo";;

при входе в верхний уровень. Модули Foo, Bar и Gee не открыты; вам всё ещё нужно сделать

        open Foo;;

самим, если это то, что вы хотите.

5.1 Параметры

Следующие параметры командной строки распознаются командой ocamlmktop.

-cclib libname
Передать параметр -llibname C-линкеру при линковке в режиме «пользовательский runtime». См. соответствующий параметр для ocamlc в главе ‍13.
-ccopt option
Передать данный параметр C-компилятору и линкеру при линковке в режиме «пользовательский runtime». См. соответствующий параметр для ocamlc в главе ‍13.
-custom
Линковка в режиме «пользовательский runtime». См. соответствующий параметр для ocamlc в главе ‍13.
-I directory
Добавить данный каталог в список каталогов, которые просматриваются для поиска файлов скомпилированного объектного кода (.cmo и .cma).
-o exec-file
Указать имя файла верхнего уровня, созданного линком. По умолчанию a.out.

6 Нативный верхний уровень: ocamlnat (экспериментальный)

В этом разделе описывается инструмент, который ещё не официально поддерживается, но может оказаться полезным.

Код OCaml, выполняемый в традиционной системе toplevel, использует интерпретатор байткода. Если требуется повышенная производительность или для тестирования программ, которые будут выполняться только корректно при компиляции в машинный код, можно использовать нативный toplevel.

В большинстве установок нативный toplevel не был установлен вместе с остальной частью инструментальной цепочки OCaml. В таких случаях потребуется создать дистрибутив OCaml из исходного кода. Из построенного дерева исходного кода дистрибутива можно использовать make natruntop для построения и выполнения нативного toplevel. (В качестве альтернативы можно использовать make ocamlnat, который выполняет только этап построения.)

Если команда make install выполняется после построения нативного toplevel, то программа ocamlnat (либо из исходного кода, либо из каталога установки) может быть вызвана непосредственно, вместо использования make natruntop.

« Партионная компиляция (ocamlc)Система выполнения (ocamlrun) »
Авторские права © 2024 Institut National de Recherche en Informatique et en Automatique

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/toplevel.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API