【问题标题】:using ghci 7.6.3, :}\n results in an error of "unknown command"使用 ghci 7.6.3, :}\n 导致“未知命令”错误
【发布时间】:2014-01-20 05:54:33
【问题描述】:

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

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

*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。

A.这是一个错误还是有某种原因 :} 会突然变成“未知命令”?

B.如果我遇到这种情况,有没有办法在不使用 ctrl+D 的情况下恢复?我尝试多少次都没关系:},一旦我进入这种情况,它总是会导致“未知命令”,尽管我期望这个命令关闭多行条目。

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

【问题讨论】:

  • Ctrl-C 退出吗?编辑:哦,我刚刚找到了重现这个的方法:输入:{<ENTER><Ctrl-C>
  • 哈!我可以确认您的序列重现了这种行为。
  • 有趣,似乎只是提示错误……您可以在非多行模式下正常使用 GHCi。只需使用:set prompt "%s> ",一切都会恢复正常。
  • 感谢本诺夫斯!您应该将其写为答案,我会将其标记为最佳答案。

标签: haskell ghci


【解决方案1】:

正如我在 cmets 中已经指出的,这种行为的原因是 GHCi 在按下 Ctrl-C 时没有正确重置提示。问题的根源大概在于以下代码(摘自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,则将永远不会执行重置提示的行。我将此代码更改为:

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

这解决了问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2016-07-06
      • 2011-05-04
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多