запуск GHCI на модуле, который требует ЯЗЫК CPP

У меня проблемы с этой последовательностью команд:

wget http://hackage.haskell.org/package/github-0.7.1/github-0.7.1.tar.gz
tar zxf github-0.7.1.tar.gz
cd github-0.7.1
ghci samples/Users/ShowUser.hs

Я получаю ошибку:

Github/Private.hs:142:0:
error: missing binary operator before token "("
Github/Private.hs:148:0:
error: missing binary operator before token "("phase `C pre-processor' failed (exitcode = 1)

и это потому, что модуль Github / Private.hs использует cpp директивы в двух местах:

#if MIN_VERSION_http_conduit(1, 9, 0)
successOrMissing s@(Status sci _) hs cookiejar
#else
successOrMissing s@(Status sci _) hs
#endif
| (200 <= sci && sci < 300) || sci == 404 = Nothing
#if MIN_VERSION_http_conduit(1, 9, 0)
| otherwise = Just $ E.toException $ StatusCodeException s hs cookiejar
#else
| otherwise = Just $ E.toException $ StatusCodeException s hs
#endif

Похоже, что ghci задыхается от этих директив CPP. Тем не мение, cabal install успешно компилирует и устанавливает пакет. С помощью ghci -XCPP не помогает

У меня вопрос: как я могу запустить пример программы (например, один в samples каталог) с ghci используя код библиотеки, который находится в Github каталог этого пакета?

Я хотел бы поэкспериментировать с настройкой как примеров программ, так и кода библиотеки, поэтому я бы хотел запустить все в ghci,

Одна вещь, которая работает, это:

cabal install
cd samples
ghci Users/ShowUser.hs

но, опять же, я бы предпочел не устанавливать библиотечный код только для того, чтобы проверить его.

7

Решение

Проблема не в препроцессоре C как таковой, но это MIN_VERSION_* макросы генерируются Cabal во время сборки, поэтому вы не получите их в GHCi. Если вы просто хотите поиграть с библиотекой без ее установки, путь наименьшего сопротивления будет закомментировать макросы, а также ветви условных выражений CPP, которые не соответствуют версии http-conduit в настоящее время у вас есть (если сомневаетесь, уточните у ghc-pkg list).


Немного более принципиальным хаком будет использование CPP для проверки того, устанавливаете ли вы с помощью cabal. Если предположить, http_conduit >= 1.9.0 это может выглядеть так:

#ifdef CABAL
#  if MIN_VERSION_http_conduit(1, 9, 0)
successOrMissing s@(Status sci _) hs cookiejar
#  else
successOrMissing s@(Status sci _) hs
#  endif
| (200 <= sci && sci < 300) || sci == 404 = Nothing
#  if MIN_VERSION_http_conduit(1, 9, 0)
| otherwise = Just $ E.toException $ StatusCodeException s hs cookiejar
#  else
| otherwise = Just $ E.toException $ StatusCodeException s hs
#  endif
#else
successOrMissing s@(Status sci _) hs cookiejar
| (200 <= sci && sci < 300) || sci == 404 = Nothing
| otherwise = Just $ E.toException $ StatusCodeException s hs cookiejar
#endif

Однако, учитывая ваш вариант использования, я не думаю, что дополнительный шаг стоит того.


Для полноты картины: этот ответ объясняет, как использовать макросы клики в GHCi. Однако для этого необходимо запустить cabal build Хотя бы один раз.

6

Другие решения

Следующая команда работает:

ghci -optP-include -optPdist/build/autogen/cabal_macros.h samples/Users/ShowUser.hs

Это говорит препроцессору C, чтобы прочитать файл dist/build/autogen/cabal_macros.h, Этот файл создан cabal build, но вы можете прервать его после preprocessing шаг:

Resolving dependencies...
Configuring github-0.7.1...
Building github-0.7.1...
Preprocessing library github-0.7.1...
[ 1 of 24] Compiling Github.Data.Definitions ( Github/Data/Definitions.hs,    dist/build/Github/Data/Definitions.o )
^C

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

:set -optP-include -optPdist/build/autogen/cabal_macros.h
11