2014-01-08 3 views
11

Почему у GHCi есть так много разных команд для загрузки модулей в сеанс?Параметры загрузки модуля в GHCi

Вот те, которые я в курсе, вместе с их довольно запутанных объяснений от :help в GHCI:

  • add [*]<mod> - добавить модуль (ов) к текущей цели установить
  • :module [+/-] [*]<mod> - набор контекст для оценки экспрессии
  • :load [*]<mod> - загрузочный модуль (ы) и их иждивенцы
  • :reload <mod> - перезагрузить текущий набор модулей. (Примечание: :help не говорит, что это может занять модуль аргумент, но мне кажется, что он может.)
  • import Mod

Что каждый из них делать? Как звездочка меняет его? Почему их так много? :(

+4

Вы прочитали [документацию] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/ghci-commands.html)? – bheklilr

+0

В документации, безусловно, не говорится о аргументе ': reload' –

+0

@bheklilr У меня не было - это помогает, спасибо – hdgarrood

ответ

10

Существуют две различные концепции на работе здесь: цель установить контекст и оценки

Вы работаете с целью установить с :add, :load и :reload, и вы работаете с контекстом оценки. с :module и .

Целевой набор - это список локально доступных модулей, которые ghci читает и компилирует. Обычно вы должны использовать это, чтобы указать источник, над которым работаете. ghci lo lo ad и скомпилировать каждый из этих модулей и любые необходимые ему зависимости.

Вы используете :load для сброса целевого набора точно в заданный набор модулей и :add для добавления данных модулей в существующий целевой набор.

Если вы задаете модули в целевом наборе с *, они всегда будут «интерпретироваться байт-кодом» - это означает, что они загружаются быстро, но не работают так быстро, как скомпилированный код, иначе ghci будет использовать скомпилированный объектный файл, если доступный и байт-код интерпретировать, если нет.

:reload самостоятельно перезагружает весь целевой набор и зависимости. Я не совсем уверен, что делает :reload <mod>, но я думаю, что он перезагружает <mod> и зависимостей и оставляет остальных нетронутыми.

Контекст оценки контролирует, какие имена находятся в области действия в подсказке, и полностью задокументирован here. Модули для добавления в контекст оценки могут быть либо локальными в целевом наборе + зависимостей, либо быть «пакетными», которые ранее были зарегистрированы в ghc, используя инструмент ghc-pkg (или cabal, который вызывает это в конечном итоге). import Foo - это еще один способ написания :module +Foo.

ПРИМЕЧАНИЕ: этот ответ представляет собой смесь моего интуитивного понимания из моего опыта использования ghci и просто чтения документации и попыток интеграции двух в моем уме. Так что я, возможно, не получил это на 100% точным!

Смежные вопросы