【问题标题】:SWI-Prolog stream I/O and tab completion in the swipl-windowSWI-Prolog 流 I/O 和 swipl-window 中的选项卡完成
【发布时间】:2013-06-28 21:02:38
【问题描述】:

我在做什么

我目前正在创建一个向 swipl-win 窗口添加制表符完成功能的 SWI-Prolog 模块。到目前为止,我实际上已经将它带到了一次读取单个字符的位置,而无需停止/返回任何内容,直到键入制表符为止。我还编写了一个谓词,通过在当前术语列表上使用子字符串匹配(通过current_functor/2current_arithmetic_function/1current_predicate/2 等获得 [所使用的谓词最终将基于上下文])。

如果您想查看我的代码,请联系here...请记住,我还不是 Prolog 大师(欢迎提供友好提示)。


我在想什么

我意识到,当我实际实现我的主要完成谓词(仍未编写)时,我必须弄清楚输入流中的最后一个“单词”是什么。 我正在讨论是否应该使用输入流中的所有内容创建一个新流(所以我不必更改输入流中的位置/回到开头)或写入字符串...如果我采用第二种方法,只要输入分隔字符(以新“单词”开头的字符,如空格、逗号、括号,运算符等),因此每次按下选项卡时都不会在流中进行任何搜索。

但是,还有另一件事:当用户浏览和修改已键入但尚未提交的查询时(通过箭头键和退格等),需要一个单独的流来处理中间流完成。如果在流的末尾请求完成,则字符串会很好(处理退格就像删除字符串的最后一个字符一样简单),但由于字符串只包含当前的“单词”,tabber.pl 会在这样的情况下不知所措。 当然,除非当前单词字符串会更新并在用户在中途导航和键入时找到光标所在的当前单词...(我可以使用at_end_of_stream(Stream) ?)


我在问什么

你认为我应该如何处理(字符串或流)? store-to-string 方法和 make-a-new-stream 方法听起来各有各的优点,所以我很确定解决方案将是两者的某种组合。 对实现我的目标有什么想法、更正或建议吗?(双关语)

为了弄清楚这一点并真正正确地做到这一点,我认为我还必须知道 SWI-Prolog 如何使用 swipl-win 窗口中的输入和输出流。 (它显然是在接受输入,但它是否在您键入 [输入流] 时使用输出流写入窗口?)

【问题讨论】:

    标签: io swi-prolog tab-completion


    【解决方案1】:

    在不更改 swipl-win.exe 控制台底层的 C 代码的情况下完成这项工作将很困难。这也与邮件列表中以here 开头的线程有关。完成调用者在 src/pl-ntmain.c, do_complete() 对于 Windows 和 src/os/pl-rl.c,prolog_completion() 用于 Unix 系统上使用的基于 GNU readline 的完成。

    要做的第一步是引导这两个以及引用线程中描述的即将到来的一个 使用回调来 Prolog。这需要对完成接口的设计进行少量研究,以得出合适的 Prolog 回调。我想这应该传递整行和插入符号位置的某种表示,并从插入符号返回完成列表。这样,任何人都可以编写自己的智能完成器。

    【讨论】:

    • 哇,感谢 Wielemaker 先生! (我很荣幸有这样一位知名且备受尊敬的人物回答了我的一个问题。)我有什么办法可以利用它来编写可以加载/添加到 SWI-Prolog 的东西(最好是同时它正在运行),而不必编译我自己的单独版本的 SWI-Prolog? (否则,我还不如编写自己的控制台窗口,它只是用户安装 Prolog 的一个界面。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多