Глава 12 Системы верхнего уровня или REPL (ocaml)
- 12.1 Параметры
- 12.2 Директивы верхнего уровня
- 12.3 Система верхнего уровня и система модулей
- 12.4 Распространённые ошибки
- 12.5 Создание пользовательских систем верхнего уровня: ocamlmktop
- 12.6 Система верхнего уровня нативно: ocamlnat (экспериментальная)
В этой главе описывается система верхнего уровня для OCaml, которая позволяет использовать систему OCaml в интерактивном режиме через цикл «чтение—вычисление—печать» (REPL). В этом режиме система многократно считывает фразы OCaml из входных данных, затем выполняет проверку типов, компиляцию и вычисление, а затем выводит тип и значение результата, если они есть. Система выводит символ # (решётка) в качестве приглашения перед чтением каждой фразы.
Входные данные для системы верхнего уровня могут занимать несколько строк. Они завершаются символом ;; (двойной точкой с запятой). Входные данные верхнего уровня состоят из одной или нескольких фраз верхнего уровня со следующим синтаксисом:
|
Фраза может состоять из определения, такого как те, которые встречаются в реализациях единиц компиляции или в выражениях модулей struct … end. Определение может связывать имена значений, имена типов, исключение, имя модуля или имя типа модуля. Система верхнего уровня выполняет связывания, а затем выводит типы и значения (если таковые имеются) для определённых имён.
Фраза также может состоять из выражения значения (раздел 9.7). Оно просто вычисляется без выполнения каких-либо связываний, а его значение выводится.
Наконец, фраза может также состоять из директивы верхнего уровня, начинающейся со знака # (решётка). Эти директивы управляют поведением системы верхнего уровня; они перечислены ниже в разделе 12.2.
Unix: Система верхнего уровня запускается командой ocaml, следующим образом:ocaml options objects # interactive mode ocaml options objects scriptfile # script modeпараметры описаны ниже. объекты — имена файлов, заканчивающиеся на .cmo или .cma; они загружаются в интерпретатор сразу после установки параметров. файл-скрипта — любое имя файла, не заканчивающееся на .cmo или .cma.Если на командной строке не указан файл-скрипта, система верхнего уровня переходит в интерактивный режим: фразы считываются со стандартного ввода, результаты выводятся на стандартный вывод, ошибки — на стандартную ошибку. Конец файла на стандартном вводе завершает работу ocaml (см. также директиву #quit в разделе 12.2).
При запуске (до чтения первой фразы), если файл .ocamlinit существует в текущем каталоге, его содержимое считывается как последовательность фраз OCaml и выполняется согласно директиве #use, описанной в разделе 12.2. Коды возврата вычислений каждой фразы не отображаются. Если в текущем каталоге нет файла .ocamlinit, ищется файл XDG_CONFIG_HOME/ocaml/init.ml в соответствии со спецификацией XDG каталога базы данных и используется вместо него (в Windows это пропускается). Если этот файл тоже не существует, используется файл [.ocamlinit] в домашнем каталоге пользователя (определяется переменной окружения HOME), если он существует.
Система верхнего уровня не выполняет редактирование строк, но её можно легко использовать совместно с внешним редактором строк, например, ledit или rlwrap. Также доступен улучшенный интерпретатор верхнего уровня, utop. Ещё один вариант — использовать ocaml в Gnu Emacs, что даёт полные возможности редактирования Emacs (команда run-caml из библиотеки inf-caml).
В любой момент выполнение парсинга, компиляции или вычисления текущей фразы может быть прервано нажатием ctrl-C (или, точнее, отправкой сигнала INTR процессу ocaml). После этого система верхнего уровня сразу же возвращается к приглашению #.
Если файл-скрипта указан на командной строке для ocaml, система верхнего уровня переходит в режим выполнения скрипта: содержимое файла считывается как последовательность фраз OCaml и выполняется согласно директиве #use (раздел 12.2). Результат вычисления не выводится. По достижении конца файла команда ocaml завершается немедленно. Команды не считываются со стандартного ввода. Sys.argv преобразуется, игнорируя все параметры OCaml, и начинается с имени файла скрипта в Sys.argv.(0).
В режиме выполнения скрипта первая строка скрипта игнорируется, если она начинается со #!. Таким образом, скрипт должен быть исполняемым и иметь в первой строке #!/usr/local/bin/ocaml, вызывая систему верхнего уровня автоматически при запуске скрипта. Однако, ocaml сам по себе является скриптом #! на большинстве установок OCaml, и ядра Unix обычно не обрабатывают вложенные скрипты #!. Лучшее решение — поместить следующее в первую строку скрипта:
#!/usr/local/bin/ocamlrun /usr/local/bin/ocaml
12.1 Параметры
Следующие параметры командной строки распознаются командой ocaml.
- -absname
- Выводить сообщения об ошибках с абсолютными путями для имён файлов.
- -args имя_файла
- Читать дополнительные аргументы командной строки, завершённые новой строкой, из имя_файла. Передавать файл_скрипта в качестве файла для запуска в верхнем уровне невозможно.
- -args0 имя_файла
- Читать дополнительные аргументы командной строки, завершённые нулём, из имя_файла. Передавать файл_скрипта в качестве файла для запуска в верхнем уровне невозможно.
- -I каталог
- Добавить указанный каталог в список каталогов, в которых ищутся исходные и скомпилированные файлы. По умолчанию сначала ищется текущий каталог, затем каталог стандартной библиотеки. Каталоги, добавленные с помощью -I, ищутся после текущего каталога, в порядке их указания в командной строке, но перед каталогом стандартной библиотеки. См. также опцию -nostdlib.
Если указанный каталог начинается с +, он считается относительным к каталогу стандартной библиотеки. Например, -I +unix добавляет подкаталог unix каталога стандартной библиотеки в путь поиска.
Каталоги также могут быть добавлены в список после запуска верхнего уровня с помощью директивы #directory (раздел 12.2).
- -init файл
- Загрузить указанный файл вместо файла инициализации по умолчанию. Файлом по умолчанию является .ocamlinit в текущем каталоге, если он существует, в противном случае XDG_CONFIG_HOME/ocaml/init.ml или .ocamlinit в домашнем каталоге пользователя.
- -labels
- Метки не игнорируются в типах, метки могут использоваться в приложениях, а именованные параметры могут быть указаны в любом порядке. Это значение по умолчанию.
- -no-app-funct
- Деактивирует прикладное поведение функторов. При использовании этой опции каждое применение функтора генерирует новые типы в своём результате, и применение того же функтора дважды к одному и тому же аргументу даёт две несовместимые структуры.
- -noassert
- Не компилировать проверки утверждений. Обратите внимание, что специальная форма assert false всегда компилируется, так как она имеет специальный тип.
- -nolabels
- Игнорировать необязательные метки в типах. Метки не могут использоваться в приложениях, и порядок параметров становится строгим.
- -noprompt
- Не отображать запрос при ожидании ввода.
- -nopromptcont
- Не отображать вторичный запрос при ожидании продолжения строк в многострочном вводе. Это следует использовать, например, при запуске ocaml в окне emacs.
- -nostdlib
- Не включать каталог стандартной библиотеки в список каталогов, в которых ищутся исходные и скомпилированные файлы.
- -ppx команда
- После парсинга передать абстрактное синтаксическое дерево в препроцессор команда. Модуль Ast_mapper, описанный в главе 27: Ast_mapper , реализует внешний интерфейс препроцессора.
- -principal
- Проверять пути информации при проверке типов, чтобы убедиться, что все типы получены главным образом. При использовании именованных аргументов и/или полиморфных методов этот флаг необходим для обеспечения того, что будущие версии компилятора смогут правильно выводить типы, даже если внутренние алгоритмы изменятся. Все программы, принятые в режиме -principal, также принимаются в режиме по умолчанию с эквивалентными типами, но разными бинарными сигнатурами, и это может замедлить проверку типов; тем не менее, рекомендуется использовать его один раз перед публикацией исходного кода.
- -rectypes
- Разрешить произвольные рекурсивные типы во время проверки типов. По умолчанию поддерживаются только рекурсивные типы, где рекурсия проходит через тип объекта.
- -safe-string
- Обеспечить разделение между типами string и bytes, сделав строки неизменяемыми. Это значение по умолчанию.
- -short-paths
- Если тип виден под несколькими модульными путями, использовать самый короткий при печати имени типа в выведенных интерфейсах и сообщениях об ошибках и предупреждениях. Имена идентификаторов, начинающиеся с нижнего подчёркивания _ или содержащие двойные подчёркивания __, вносят штраф +10 при вычислении их длины.
- -stdin
- Читать стандартный ввод как файл скрипта вместо запуска интерактивной сессии.
- -strict-sequence
- Принудительно задать тип левой части каждого последовательного выражения как единицу.
- -strict-formats
- Отклонять недействительные форматы, которые принимались в реализациях форматов предшествующих версий. Следует использовать этот флаг для обнаружения и исправления таких недействительных форматов, так как они будут отклоняться будущими версиями OCaml.
- -unsafe
- Отключить проверку границ для массивов и строк (конструкции v.(i) и s.[i]). Программы, скомпилированные с -unsafe, поэтому быстрее, но небезопасны: может произойти всё что угодно, если программа обращается к массиву или строке за пределами его границ.
- -unsafe-string
- Идентифицировать типы string и bytes, сделав строки изменяемыми. Это предназначено для совместимости со старым исходным кодом и не должно использоваться с новым ПО.
- -v
- Вывести номер версии компилятора и расположение каталога стандартной библиотеки, затем завершить работу.
- -verbose
- Вывести все внешние команды перед их выполнением. Полезно для отладки проблем с библиотеками C.
- -version
- Вывести строку версии и завершить работу.
- -vnum
- Вывести короткий номер версии и завершить работу.
- -no-version
- Не выводить баннер версии при запуске.
- -w список_предупреждений
- Включить, отключить или пометить как критическое предупреждения, указанные в аргументе 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
- Устаревший синоним предупреждения ’устаревший’.
- 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
- Модуль подключается дважды в одном исполняемом файле.
- 32 unused-value-declaration
- Неиспользуемое объявление значения.
- 33 unused-open
- Неиспользуемый оператор open.
- 34 unused-type-declaration
- Неиспользуемое объявление типа.
- 35 unused-for-index
- Неиспользуемый индекс цикла for.
- 36 unused-ancestor
- Неиспользуемый предковый объект.
- 37 unused-constructor
- Неиспользуемый конструктор.
- 38 unused-extension
- Неиспользуемый расширяющий конструктор.
- 39 unused-rec-flag
- Неиспользуемый флаг rec.
- 40 name-out-of-scope
- Имя конструктора или метки используется вне области видимости.
- 41 ambiguous-name
- Неоднозначное имя конструктора или метки.
- 42 disambiguated-name
- Разрешённое имя конструктора или метки (предупреждение совместимости).
- 43 nonoptional-label
- Необязательная метка применена как необязательная.
- 44 open-shadow-identifier
- Оператор open затеняет уже определённый идентификатор.
- 45 open-shadow-label-constructor
- Оператор open затеняет уже определённую метку или конструктор.
- 46 bad-env-variable
- Ошибка в переменной среды.
- 47 attribute-payload
- Неправильная нагрузка атрибута.
- 48 eliminated-optional-arguments
- Неявное исключение необязательных аргументов.
- 49 no-cmi-file
- Отсутствует файл cmi при поиске псевдонима модуля.
- 50 unexpected-docstring
- Неожиданный комментарий документации.
- 51 wrong-tailcall-expectation
- Вызов функции с неправильным атрибутом @tailcall
- 52 fragile-literal-pattern (см. 11.5.3)
- Хрупкий шаблон константы.
- 53 misplaced-attribute
- Атрибут не может появиться в данном контексте.
- 54 duplicated-attribute
- Атрибут используется более одного раза в выражении.
- 55 inlining-impossible
- Внедрение невозможно.
- 56 unreachable-case
- Недостижимый случай в сопоставлении с образцом (на основе информации о типе).
- 57 ambiguous-var-in-pattern-guard (см. 11.5.4)
- Неоднозначные переменные в шаблоне "или" под условием.
- 58 no-cmx-file
- Отсутствует файл cmx.
- 59 flambda-assignment-to-non-mutable-value
- Присвоение неизменяемому значению.
- 60 unused-module
- Неиспользуемое объявление модуля.
- 61 unboxable-type-in-prim-decl
- Нераспаковываемый тип в примитивном объявлении.
- 62 constraint-on-gadt
- Ограничение типа на объявлении типа GADT.
- 63 erroneous-printed-signature
- Некорректная напечатанная сигнатура.
- 64 unsafe-array-syntax-without-parsing
- -unsafe используется с препроцессором, возвращающим синтаксическое дерево.
- 65 redefining-unit
- Объявление типа, определяющее новый конструктор ’()’.
- 66 unused-open-bang
- Неиспользуемое выражение open!.
- 67 unused-functor-parameter
- Неиспользуемый параметр функтора.
- 68 match-on-mutable-state-prevent-uncurry
- Сопоставление с образцом, зависящее от изменяемого состояния, предотвращает раскручивание оставшихся аргументов.
- 69 unused-field
- Неиспользуемое поле записи.
- 70 missing-mli
- Отсутствует файл интерфейса.
- 71 unused-tmc-attribute
- Неиспользуемый атрибут @tail_mod_cons
- 72 tmc-breaks-tailcall
- Преобразование @tail_mod_cons превращает хвостовую рекурсию в нехвостовую.
- 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+31 (только предупреждение 31 является фатальным).
- -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. В противном случае они выводятся без escape.
- TERM
- При выводе сообщений об ошибках система toplevel пытается визуально подчеркнуть местоположение ошибки. Она обращается к переменной TERM, чтобы определить тип терминала вывода и найти его возможности в базе данных терминалов.
- XDG_CONFIG_HOME, HOME
- Процедура поиска .ocamlinit (см. выше).
12.2 Директивы toplevel
Следующие директивы управляют поведением toplevel, загружают файлы в память и отслеживают выполнение программы.
Примечание: все директивы начинаются со знака # (решётка). Этот # символ должен быть набран перед директивой и не должен путаться с символом #, отображаемым в интерактивной оболочке. Например, набрав #quit;;, вы выйдете из основной оболочки, но набрав 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, но также обертывает код в модуль верхнего уровня с тем же именем, что и имя файла без расширения, используя семантику компилятора.
Для директив, принимающих имена файлов в качестве аргументов, если в имени файла не указана директория, файл ищется в следующих директориях:
- В режиме скрипта - в директории, содержащей выполняемый скрипт; в интерактивном режиме - в текущей рабочей директории.
- Директории, добавленные с помощью директивы #directory.
- Директории, заданные в командной строке с помощью опций -I.
- Директория стандартной библиотеки.
- Запросы к среде
-
- #show_class путь_класса;;
- #show_class_type путь_класса;;
- #show_exception идентификатор;;
- #show_module путь_модуля;;
- #show_module_type путь_типа_модуля;;
- #show_type тип_константы;;
- #show_val путь_значения;;
- Вывод сигнатуры соответствующего компонента.
- #show идентификатор;;
- Вывод сигнатур компонентов с именем идентификатор во всех вышеперечисленных категориях.
- Красивая печать
-
- #install_printer имя_печаталки;;
- Эта директива регистрирует функцию с именем имя_печаталки (путь к значению) как печатающую функцию для значений, типы которых совпадают с типом аргумента функции. То есть, цикл верхнего уровня вызовет имя_печаталки, когда будет нужно напечатать такое значение.
- #print_depth n;;
- Ограничение печати значений максимальной глубиной n. Части значений, глубина которых превышает n, выводятся как ... (многоточие).
- #print_length n;;
- Ограничение числа печатаемых узлов значения до n максимального. Остальные части значений выводятся как ... (многоточие).
- #remove_printer имя_печаталки;;
- Удаление указанной функции из таблицы печатающих функций верхнего уровня.
- Отслеживание
-
- #trace имя_функции;;
- После выполнения этой директивы все вызовы функции с именем имя_функции будут отслеживаться. То есть, аргумент и результат отображаются для каждого вызова, а также исключения, выходящие из функции, поднятые как самой функцией, так и другой функцией, которую она вызывает. Если функция является каррированной, каждый аргумент печатается по мере его передачи в функцию.
- #untrace имя_функции;;
- Остановка отслеживания указанной функции.
- #untrace_all;;
- Остановка отслеживания всех функций, отслеживаемых до сих пор.
- Опции компилятора
-
- #labels bool;;
- Игнорировать метки в типах функций, если аргумент false, или переключиться на стандартное поведение (стиль перестановки) если аргумент true.
- #ppx "имя-файла";;
- После парсинга передать абстрактное синтаксическое дерево в препроцессор.
- #principal bool;;
- Если аргумент true, проверять пути информации во время проверки типов, чтобы убедиться, что все типы получены главным образом. Если аргумент false, проверять пути информации не нужно.
- #rectypes;;
- Разрешить произвольные рекурсивные типы во время проверки типов. Примечание: после включения этот параметр нельзя отключить, так как это приведёт к ненадёжности системы типов.
- #warn_error "список-предупреждений";;
- Считать предупреждения, включенные аргументом, ошибками, а предупреждения, отключенные аргументом, нормальными предупреждениями.
- #warnings "список-предупреждений";;
- Включить или отключить предупреждения в соответствии с аргументом.
12.3 Основные модули и система модулей
Фразы верхнего уровня могут ссылаться на идентификаторы, определённые в блоках компиляции, с помощью тех же механизмов, что и для отдельно компилируемых модулей: либо с использованием квалифицированных имён (ИмяМодуля.локальноеИмя), либо с использованием конструкции open и неквалифицированных имён (см. раздел 9.3).
Однако перед ссылкой на другой блок компиляции реализация этого блока должна быть загружена в память. При запуске система верхнего уровня содержит реализации всех модулей стандартной библиотеки. Реализации модулей пользователя можно загрузить с помощью директивы #load, описанной выше. Ссылка на блок, реализация которого не загружена, приведёт к ошибке Ссылка на неопределённую глобальную переменную `...'.
Обратите внимание, что выполнение open Мод только предоставляет доступ к скомпилированному интерфейсу (.cmi-файл) для Мод, но не загружает реализацию Мод и не приводит к ошибке, если реализация Мод не загружена. Ошибка «ссылка на неопределённую глобальную переменную Мод» появится только при выполнении значения или определения модуля, которые ссылаются на Мод.
12.4 Распространённые ошибки
В этом разделе описаны и объяснены наиболее часто встречающиеся сообщения об ошибках.
- Файл имя-файла не найден
- Файл с указанным именем не найден ни в текущем каталоге, ни в каталогах пути поиска.
Если имя-файла имеет формат мод.cmi, это означает, что вы обратились к блоку компиляции мод, но его скомпилированный интерфейс не найден. Решение: сначала скомпилируйте мод.mli или мод.ml, чтобы создать скомпилированный интерфейс мод.cmi.
Если имя-файла имеет формат мод.cmo, это означает, что вы пытаетесь загрузить с помощью #load файл байткода, который ещё не существует. Решение: сначала скомпилируйте мод.ml.
Если ваша программа расположена в нескольких каталогах, эта ошибка также может появиться, потому что вы не указали каталоги для поиска. Решение: используйте директиву #directory для добавления соответствующих каталогов в путь поиска.
- Это выражение имеет тип t1, но используется с типом t2
- См. раздел 11.4.
- Ссылка на неопределённую глобальную переменную мод
- Вы забыли загрузить в память реализацию модуля с помощью #load. См. раздел 12.3 выше.
12.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;;
сами, если это нужно.
12.5.1 Параметры
Следующие параметры командной строки распознаются командой ocamlmktop.
- -cclib имя-библиотеки
- Передать параметр -lимя-библиотеки к компоновщику C при компоновке в режиме «пользовательской среды выполнения». См. соответствующий параметр для ocamlc в главе 11.
- -ccopt параметр
- Передать данный параметр к компилятору и компоновщику C при компоновке в режиме «пользовательской среды выполнения». См. соответствующий параметр для ocamlc в главе 11.
- -custom
- Компоновать в режиме «пользовательской среды выполнения». См. соответствующий параметр для ocamlc в главе 11.
- -I каталог
- Добавить указанный каталог в список каталогов, которые будут проверяться при поиске скомпилированных объектных файлов (.cmo и .cma).
- -o исполняемый-файл
- Указать имя создаваемого файла интерпретатора. По умолчанию это a.out.
12.6 Интерпретатор нативном коде: ocamlnat (экспериментальный)
Этот раздел описывает инструмент, который пока не поддерживается официально, но может быть полезным.
Код OCaml, выполняемый в традиционной системе верхнего уровня, использует интерпретатор байткода. При необходимости высокой производительности или для тестирования программ, которые будут работать только при компиляции в машинный код, вместо этого можно использовать интерпретатор нативном коде.
Для большинства установок родной главный уровень не был установлен вместе с остальной частью инструментальной цепочки OCaml. В таких обстоятельствах потребуется создать дистрибутив OCaml из исходного кода. Из созданного исходного дерева дистрибутива вы можете использовать make natruntop для построения и выполнения родного главного уровня. (В качестве альтернативы можно использовать make ocamlnat, который выполняет только этап сборки.)
Если команда make install выполняется после построения родного главного уровня, то программа ocamlnat (либо из исходного кода, либо из каталога установки) может быть вызвана напрямую, а не используя make natruntop.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/toplevel.html