У меня проблемы с этой последовательностью команд:
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
но, опять же, я бы предпочел не устанавливать библиотечный код только для того, чтобы проверить его.
Проблема не в препроцессоре 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
Хотя бы один раз.
Следующая команда работает:
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