Флаг командной строки стека Haskell для выполнения выражения - PullRequest
0 голосов
/ 25 ноября 2018

Если у меня есть простой однострочный текст на Haskell, какой флаг в ghc или ghci может выполнить это из командной строки?

Я ищу что-то вроде:

stack ghci -e 'putStrLn "hello world"'

Аналогично

$ R --quiet -e "cat('hello world')"
> cat('hello world')
hello world> 

или

$ python -c "print('hello world')"
hello world

Редактировать для отладки 'ghci -e'

(Этот вопрос уже решен с отличным ответом, но простоотладка того, что флаг кажется / должен / работать выше ...)

Странно не получается заставить работать, казалось бы, поддерживаемую ghci -e.Тестируя это не только мой компьютер, я также запустил его на Ubuntu и у меня возникла та же проблема:

FROM ubuntu:18.04
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update \
 && apt-get install  --yes curl \   
 && curl -sSL https://get.haskellstack.org/ | sh \
 && export HOME=/root/.local/bin:$HOME \
 && stack ghci -e 'putStrLn "hello world"'

Затем

$ docker build .

Произведено ...

Stack has been installed to: /usr/local/bin/stack

WARNING: '/root/.local/bin' is not on your PATH.
    For best results, please add it to the beginning of PATH in your profile.

Invalid option `-e'

Usage: stack ghci [TARGET/FILE] [--ghci-options OPTIONS] [--ghc-options OPTIONS]
                  [--flag PACKAGE:[-]FLAG] [--with-ghc GHC] [--[no-]load]
                  [--package ARG] [--main-is TARGET] [--load-local-deps]
                  [--[no-]package-hiding] [--only-main] [--trace] [--profile]
                  [--no-strip] [--[no-]test] [--[no-]bench] [--help]
  Run ghci in the context of package(s) (experimental)
The command '/bin/sh -c apt-get update  && apt-get install  --yes curl  && curl -sSL https://get.haskellstack.org/ | sh  && export HOME=/root/.local/bin:$HOME  && stack ghci -e 'putStrLn "hello world"'' returned a non-zero code: 1

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Если вы отметите $ stack --help в какой-то момент, вы увидите, что

eval                     Evaluate some haskell code inline. Shortcut for
                         'stack exec ghc -- -e CODE'

Так что вместо того, чтобы делать как

$ stack exec ghc -- -e 'putStrLn "hello world"'
hello world

, вы можете сделать как

$ stack eval 'putStrLn "hello world"'
hello world
0 голосов
/ 25 ноября 2018

На самом деле у вас уже есть этот флаг : он просто:

-e expr

Оценить expr;подробности смотрите в eval-mode

Таким образом, вы можете написать это следующим образом:

ghci <b>-e</b> 'putStrLn "hello world"'

Фактически, если вы используете stack ghci, вы просто открываете ghci с вашим приложением,но флаг -e не является «специфичным для стека».

Например:

$ ghci -e 'putStrLn "hello world"'
hello world
...