编辑4: 原来这只是TTY输入的限制; 没有OCaml、Coq或Emacs导致问题。
我正在使用Emacs中的Proof General编写Coq程序,发现了一个输入太长的错误。如果提交给coqtop
的区域通过Proof General包含超过1023个字符,则Proof General(但不是Emacs)在等待响应时挂起,并且*coq*
缓冲区对于每个超过1023个字符的字符都会多出一个^G
字符。例如,如果将1025个字符的区域发送到coqtop
,则*coq*
缓冲区将以两个额外的字符^G^G
结尾。我无法继续处理文件,并且必须杀死coqtop
进程(可以使用C-c C-x或从终端使用kill
/killall
)。
此限制的某些方面源自coqtop
本身。如果生成一个1024个字符或更长的字符串并将其管道化,例如运行
perl -e 'print ("Eval simpl in " . (" " x 1024) . "1.\n")' | coqtop
如果我在终端中运行coqtop
,每行最多只能输入1024个字符,包括回车符。因此,输入1023个字符后按回车键是可以的;但是,在输入1024个字符后,按任何键(包括回车键,但不包括删除键等)都只会发出哔声而没有其他反应。同样地,coqc
也可以正常工作。事实证明,ocaml
(OCaml顶层)也具有相同的行为:
perl -e 'print ((" " x 1024) . "1;;")' | ocaml
这个程序可以正常工作,但是如果从终端运行 ocaml
,我无法在一行上输入超过1024个字符。由于我理解的是 coqtop
依赖于OCaml toplevel(当以 coqtop -byte
运行时更明显),我想这是一个相关的限制。
相关软件版本如下:
- OCaml 3.12.1,来自 Homebrew;
- Coq 8.3pl3(和8.3pl2),来自 Homebrew;
- Proof General 4.1;
- GNU Emacs 24.1.1,来自 Emacs for Mac OS X;
- Mac OS X 10.6.7。
我的问题是:
- 是什么导致了
ocaml
和coqtop
的字符限制?为什么只对来自终端或Emacs的输入有效,而不对来自管道或文件的输入有效? - 为什么Proof General(显然)无视这个限制会导致挂起错误和神秘的
^G
? - 如何解决这个限制?我的最终目标是在Proof General/Emacs中使用Coq,因此可以规避基本问题的解决方法是可以接受的。
编辑3:发现1024个字符输入限制也存在于Ocaml toplevel中(我想这是相关的),因此我添加了该信息并删除了原始问题描述,因为它已完全被掩盖和取代。(如果需要,可以查看编辑历史记录)。
rlwrap
让我可以输入更多字符,但在提交时会出错。第三:重构是一个选择,但只能做到一定程度。如果我的Inductive
定义很长,我不能有效地将其分成多个较小的数据类型 :-/所以希望我能找到实际的解决方法。 - Antal Spector-Zabusky