【发布时间】:2013-06-28 21:02:38
【问题描述】:
我在做什么
我目前正在创建一个向 swipl-win 窗口添加制表符完成功能的 SWI-Prolog 模块。到目前为止,我实际上已经将它带到了一次读取单个字符的位置,而无需停止/返回任何内容,直到键入制表符为止。我还编写了一个谓词,通过在当前术语列表上使用子字符串匹配(通过current_functor/2、current_arithmetic_function/1、current_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