Haskell GHCI перезагрузить и затем оценить последнее выражение - PullRequest
1 голос
/ 15 апреля 2020

Как я могу сделать перезагрузку и затем оценить последнее выражение внутри GHCI?

Под last expression Я имею в виду последнее, что вы ввели в GHCI, который не был командой GHCI. Например: 42, "I am an expression", et c.

Пример использования, скажем, перезагрузить и затем оценить последнее выражение GHCI команда: :x:

>>> 42
42
>>> :x
42
>>>

В приведенном выше примере :x выполняет перезагрузку, а затем снова оценивает 42.

Существует ли какая-либо команда GHCI, которая оценивает последнее выражение?

Если была какая-то команда GHCI, которая вычисляет последнюю выражение, скажем, это было :last, я мог бы перезагрузить и оценить последнее выражение, добавив следующее к .ghci:

:def re const $ return $ Data.List.unlines [":reload", ":last"]

В руководстве говорится, что : делает Repeat the previous command.

https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html

Но я попробовал это в cabal repl, и это не сработало. Просто печатает список макросов:

1 Ответ

1 голос
/ 17 апреля 2020

Мне не удалось найти какое-либо описание этой функции в GHCi, и тот факт, что она реализована с использованием обертки вокруг GHCi в пакете Atom IDE- Haskell -REPL , приводит меня к считаю, что это потому, что GHCi не может сделать это самостоятельно. GHCi также не позволяет другим процессам получать доступ к его истории во время сеанса, поскольку его история сохраняется только в файл (~/.ghc/ghci_history на unix) в конце сеанса, поэтому сценарий сеанса GHCi хитрый (но см. ниже).

Я думаю, что самое близкое, что вы можете получить, это запустить GHCi с помощью скрипта-обёртки, используя expect, чтобы он слушал спецификацию c последовательность нажатий клавиш, а затем отправьте вам ключи:: r enter up up enter:

#!/usr/bin/env expect

log_user 0
spawn ghci
log_user 1

while 1 {
  interact "##" {send ":r\r\[A\[A\r"} #see note
  exit
}

Таким образом, когда вы нажимаете ##, GHCi будет перезагружаться и запускать / оценивать любую команду или выражение первый в истории. Это, по общему признанию, грубое решение, и оно может быть не самым безопасным, но я хотел, по крайней мере, предложить альтернативу.

Примечание : похоже, что управляющие символы в Приведенный выше блок кода отображается неправильно, поэтому вам может потребоваться получить их из источника разметки этого ответа или из выходных данных команды autoexpect .

...