使用ghci 7.6.3,:} \ n导致“未知命令”错误

时间:2014-01-02 17:55:11

标签: haskell ghci

我有时会遇到这个错误,虽然不是所有的时间,但它让我发疯。我不知道这是一个错误,还是有一些我不知道的行为或修复。

我正在输入一个多行命令:{和:},当我想结束命令时,如下所示,我收到错误,如下所示:

*MyModule| :}
unknown command ':}'
use :? for help.

我说它在97%的情况下都能正常工作,但有3%的时间我会遇到这种情况。

据我所知,应该总是输入:}来关闭多行条目,如下所述:

http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/interactive-evaluation.html

目前,我知道在发生这种情况时唯一可以解决这种情况的方法是ctrl + D,不幸的是它杀死了ghci。

一个。这是一个错误还是有一些原因:}会突然变成一个"未知的命令"?

B中。如果我遇到这种情况,有没有办法恢复而不使用ctrl + D?我尝试多少次并不重要:},它总是导致"未知命令"一旦我进入这个位置,虽然我期望这个命令关闭多行输入。

就像在问题中所说的那样,这是Arch Linux上的GHCi,版本7.6.3。

2 个答案:

答案 0 :(得分:4)

This is a known bug.一切正常除了 ghci有时会在打印正常提示时打印多行提示。

答案 1 :(得分:4)

正如我在评论中已经注意到的,这种行为的原因是当按下Ctrl-C时GHCi没有正确重置提示。问题的根源可能在于以下代码(取自ghci-ng):

multiLineCmd q = do
  st <- lift getGHCiState
  let p = prompt st
  lift $ setGHCiState st{ prompt = prompt2 st }
  mb_cmd <- collectCommand q ""
  lift $ getGHCiState >>= \st' -> setGHCiState st'{ prompt = p }
  return mb_cmd

(见InteractiveUI.hs line 712

如果collectCommand抛出UserInterrupt,则重置promt的行将永远不会被执行。我将此代码更改为:

multiLineCmd q = do
  st <- lift getGHCiState
  let p = prompt st
  lift $ setGHCiState st{ prompt = prompt2 st }
  mb_cmd <- collectCommand q "" `GHC.gfinally` lift (getGHCiState >>= \st' -> setGHCiState st'{ prompt = p })
  return mb_cmd

解决了这个问题。