Emacs 无法向OCaml顶级和coqtop(以及常规)提供长(1024+;字符)输入

Emacs 无法向OCaml顶级和coqtop(以及常规)提供长(1024+;字符)输入,emacs,ocaml,tty,coq,proof-general,Emacs,Ocaml,Tty,Coq,Proof General,编辑4:事实证明,这实际上只是TTY输入的一般限制;关于导致问题的OCaml、Coq或Emacs没有任何具体的说明 我正在使用Emacs中的Proof General开发一个Coq程序,发现一个输入太长的bug。如果要通过Proof General提交给coqtop的区域包含超过1023个字符,则Proof General(虽然不是Emacs)在等待响应时挂起,并且对于超过1023个字符的每个字符,*coq*缓冲区都包含一个额外的^G字符。例如,如果将1025个字符的区域发送到coqtop,则

编辑4:事实证明,这实际上只是TTY输入的一般限制;关于导致问题的OCaml、Coq或Emacs没有任何具体的说明


我正在使用Emacs中的Proof General开发一个Coq程序,发现一个输入太长的bug。如果要通过Proof General提交给
coqtop
的区域包含超过1023个字符,则Proof General(虽然不是Emacs)在等待响应时挂起,并且对于超过1023个字符的每个字符,
*coq*
缓冲区都包含一个额外的
^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
然后一切正常。(类似地,
coqc
也可以正常工作。)但是,如果在终端中运行
coqtop
,则一行不能键入超过1024个字符,包括结束返回字符。因此,键入一行1023个字符,然后点击返回即可;但在输入1024个字符后,点击任何键,包括return(但不包括delete等),只会发出一声嘟嘟声。结果证明,
ocaml
(ocaml顶级)具有相同的行为:

perl -e 'print ((" " x 1024) . "1;;")' | ocaml
工作正常,但如果从终端运行
ocaml
,一行不能键入超过1024个字符。因为我的理解是,
coqtop
依赖于OCaml顶级(当作为
coqtop-byte
运行时更明显),所以我认为这是一个相关的限制

相关软件版本包括:

  • 3.12.1从
  • 8.3pl3(和8.3pl2)来自
  • 4.1
  • 从中构建24.1.1;及
  • MacOSX10.6.7
我的问题是:

  • 那么
    ocaml
    coqtop
    是如何强制执行此字符限制的呢?为什么只从终端或Emacs输入,而不是从管道或文件输入
  • 为什么证明将军(显然)不知道这个限制会导致挂起错误和神秘的
    ^G
    s
  • 我如何克服这个限制?我的最终目标是使用Coq inside-Proof-General/Emacs,因此避开潜在问题的变通方法是好的


编辑3:在发现Ocaml顶级中也存在1024个字符的输入限制(我认为这是相关的)后,我添加了该信息,并删除了原始问题描述,因为它已完全模糊并被取代。(如有必要,请参阅)。

我不确定Emacs/coqtop交互在这里如何发挥作用,但我相信确实存在OCaml顶级错误,应该报告它。你准备好报告了吗?如果没有,我可以处理

那么ocaml和coqtop如何强制执行此字符限制

顶级代码中有各种输入缓冲区,其中一些长度为1024;在快速查看代码之后,如果输入太大,就会有一个调整大小的逻辑,因此应该可以工作。我已经能够重现“在交互顶层中不能键入超过N个字符”的问题(当不使用
rlwrap
时),但限制为N=4096而不是N=1024,因此我不确定这是完全相同的问题

为什么只从终端或Emacs输入,而不是从管道或文件输入

顶层代码区分交互式和非交互式输入;iirc。例如,它会影响错误位置的打印方式

为什么证明将军(显然)不知道这个限制会导致悬挂错误和神秘的^Gs

我不知道。您观察到的
coqtop
问题甚至可能是由类似缓冲逻辑引起的另一个bug(与
ocaml
问题不同)

我如何克服这个限制

一般来说,不要一次发送太长的输入如何?也许您可以将代码分解为使用中介定义或其他东西,以保持在限制之下

关于“上游修复”的情况:我相信OCaml和Coq都在很快获得新版本的过程中。如果人们对这个bug有足够的兴趣,很快就能得到修复(特别是,如果你自己找到修复的话),那么它可以很快地集成到上游。否则,您将不得不等待下一个发布周期,并可能在此期间维护本地fork以避免问题。实际上,“通过改变我的Coq开发来解决问题”的选择可能是最省力的解决方案,但它不会使整个人类受益

编辑:(回答评论)

我想到的调整大小逻辑在
Lexing.lex_refill
中,在
stdlib/Lexing.ml
中找到,由
Lexing.from_函数创建的闭包调用,从
toplevel/toploop.ml
调用

我还有另一个“变通”方法:将你的长短语写入一个外部文件
foo.v
,然后使用
Load foo.
让顶层读取文件本身。我怀疑这将解决大小限制问题,但尚未测试。

我在OCaml错误跟踪器上报告了这一点,用户dim解释说,这不是OCaml本身的问题,而是TTY输入的限制。问题是这个。由于文本在用户点击return之前不会发送到正在运行的命令,所以所有等待的输入都必须存储在某个地方。它所存储的缓冲区,称为输入