パイプとコンソール

私はプログラミング言語 SchemeWindows 10 の上でよく用い、日常的には GaucheSagittarius といった処理系を使うことが多い。 使っているエディタは Emacs なので、処理系を呼出すのも Emacs からだ。 ふと他の FomentOtus Lisp などといった処理系も Emacs から使ってみようと思い立ってやってみると暴走状態に陥った。

しかし、 Emacs ではなく VSCode からだと問題なく動作するのである。 この違いが生じる原因は Emacs は処理系とパイプで接続しているが、 VSCode はコンソール API を再現している (らしい) ことによるものと思われる。 実際、標準入出力の接続先を GetFileType API で確認してみると違いがあることがわかる。

Windows のコンソールの制御はコンソール制御系の API を使うことで可能になっている。 コンソールにはスクリーンバッファと呼ばれるオブジェクトが結び付けられていて、スクリーンバッファに対する操作をすれば表示に反映されるのだ。 ただ、日常的にはテキスト表示をするときは標準出力に対する操作としてプログラムを書くことが多いだろう。 これは Windows の C ランタイム (いわゆる MSVCRT) が仲立ちして上手いことやっている。

Foment や Otus Lisp の場合は、コンソールに繋がっていないにもかかわらず対話的な使い方をしようとすることに充分な配慮がない、あるいは配慮はしていても WindowsUnix と違う部分で上手くいってないのだろう。 具体的にどこで問題があるのかは突き止められなかった。

430b29f08f2eef8ec6086be263925a11