2016-08-07 2 views
0

が壊れている、私は最近(7.10 GHC)はbash経由ペパーミントという名前のLinuxディストリビューションとHaskellのプラットフォームをインストールしましたが、GHCiの中のGHCi STDINと間違って何かがなければならない理由は次のとおりです。読むSTDINがWindowsから来

interact $ take 0 はエラーを返しますが、 interact $ take 1 は出力しません。私はbackspacearrowsまたは任意の他のコントロールボタンを使用する場合、標準入力に書き込むとき

はさらに、それは、チャーシンボルに入ります。あなたはすべてを逃れることができたので、制御コードリテラルについての代わりに入力された最後の文字を削除するのでGHCiの^?に入る例のバックスペース...

[email protected] ~ $ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> interact $ take 0 
Prelude> 
<stdin>: hGetChar: illegal operation (handle is closed) 
[email protected] ~ $ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> readLn :: IO String 
euoe^?^?^[[1;5C^[[D^[[B -- here I tried to delete 'euoe' 
+0

どのようにプログラムを実行していますか?また何が起こると思いますか? GHCIは何かをパイプで実行しているようですので、あなたは標準入力を再読み込みできるかどうかはわかりません。 – pdexter

+2

これはあなたの問題に関連しているようです:http://stackoverflow.com/questions/38776023/handle-is-semi-closed-error-in-haskell – villou24

+3

'interact'とGHCiはよく混ざりません、IIRC。 'interact'はすべての標準を自分自身のために望んでおり、GHCiはそれを元に戻すことはできません。 – chi

答えて

3

の場合、これは通常、キー入力を解釈する行エディタ(readline、Haskeline)があります。

私は詳細は分かりませんが、GHCiを呼び出すのはサブシェルをbash --noeditingで開始するようなものです。これにより、GHCiはリード線ライブラリからの干渉なしに生のキーの押下を受け取ることができます。これは、GHCiがreadline —の代わりに使用するHaskeline —は、利用可能な機能のタブ補完などの設定が簡単にできるためです(GHCiはタブ補完を提供していましたか?)。

GHCiからgetLineを呼び出すと、トラップドアが効果的に落とされ、Haskelineが完全に真っ直ぐに進みます。結局のところ、唯一の標準があります。バッファされていない端末に直接入力しています。

最初の懸念に戻ると、Prelude>プロンプトを印刷した後にGHCiがただちに取り消す理由は1つだけです。 interact(これは舞台裏でhGetContentsを使用しています)は、ハンドル(stdin)を介して来るすべての入力を1つの大きな怠け者として扱うと主張していますString。効果的には、interactがまだ処理を主張していないハンドルには入力が残っていない可能性があるので、ハンドルは即座に“セミクローズ”の状態になります。それは閉鎖されていません(まだ怠け者Stringinteract getsの一部として読み込まれる入力がさらにあるかもしれませんが)です。そうでなければ入力は重複しています。interactgetLine同じ行を得るだろう!)。

interactを使用した後で、GHCiに戻っても、stdoutは正常です。したがって、通常どおりにプロンプ​​トが表示され、GHCiはHaskelineを基に処理する行を返します。 Haskeline(ラインエディタとして)は、ブロックをgetChar(iirc)と呼んで、行に文字を追加するか、または行編集コマンドを実行し、半閉じハンドルを扱うために終了します。こうして、より弱い生き物が落ち、人生の大きな輪が広がる。

+0

ありがとう、コントロールコードのリテラルは本当に痛いです。なぜなら、私は何の打ち間違いもしないからです... Windows ghciはどうにか正しい方法でそれらを解釈してしまいました。なぜlinux ghciができないのか混乱しています。 –

関連する問題