2

私がやっていること

現在、swipl-win ウィンドウにタブ補完機能を追加する SWI-Prolog モジュールの作成に取り組んでいます。これまでのところ、タブ文字が入力されるまで何も停止/返さずに、一度に1文字ずつ読み取るところまで実際に到達しました。current_functor/2また、現在の用語のリスト ( 、current_arithmetic_function/1current_predicate/2などを介して取得される [使用される述語は最終的にはコンテキストに基づく]) の部分文字列一致を使用して、不完全に型付けされた用語の可能なすべての補完を返す述語も既に作成しています。

私のコードを見たい場合は、ここにあります...私はまだPrologの達人ではないことを覚えておいてください(親切なヒントは大歓迎です)。


私が考えていること

メインの補完述語 (まだ書かれていない) を実際に実装するとき、入力ストリームの最後の「単語」が何であるかを把握する必要があることに気付きました。これまでの入力ストリームのすべてを使用して新しいストリームを作成するか(入力ストリームの位置を変更する/最初に戻る必要がないため) 、文字列に書き込むかについて議論しています... 2 番目のアプローチを取る場合、区切り文字 (スペース、カンマ、括弧、演算子などの新しい「単語」を開始する文字) が入力されるたびに文字列からやり直すので、区切り文字はありません。タブが押されるたびにストリームを検索します。

ただし、別のことがあります。ユーザーが入力されたがまだ送信されていないクエリをナビゲートして変更している場合 (矢印キーやバックスペースなどを使用)、ストリームの途中での完了を処理するために別のストリームが必要です。ストリームの最後で補完が要求された場合、文字列は問題なく機能します (バックスペースの処理は、文字列の最後の文字を削除するのと同じくらい簡単です)。ただし、文字列には現在の「単語」しか含まれないため、tabber.pl はそのような場合に途方に暮れます。もちろん、現在の単語の文字列が更新され、ユーザーがストリームの途中でナビゲートして入力したときにカーソルがある現在の単語を見つけない限り... (at_end_of_stream(Stream)そのために使用できますか?)


私が求めていること

これ(文字列またはストリーム)にどのようにアプローチする必要があると思いますか? store-to-string 方式と make-a-new-stream 方式はどちらもそれぞれに利点があるように聞こえるので、解決策は両方の何らかの組み合わせになると確信しています。私の目標を達成するためのアイデア、修正、または提案はありますか? (しゃれた意図)

それを理解し、実際にこれを正しく行うには、SWI-Prolog が swipl-win ウィンドウで入力ストリームと出力ストリームをどのように使用するかを知る必要があると思います。(明らかに入力を受け入れますが、[入力ストリームに]入力すると、出力ストリームを使用してウィンドウに書き込みますか?)

4

1 に答える 1

0

swipl-win.exe コンソールの基礎となる C コードを変更せずにこれを行うのは困難です。これは、ここから始まるメーリング リストのスレッドにも関連しています。補完の呼び出し元は、Windows の場合は src/pl-ntmain.c の do_complete() にあり、Unix システムで使用される GNU readline ベースの補完の場合は src/os/pl-rl.c の prolog_completion() にあります。

最初のステップは、コールバックを使用して、これら 2 つと、参照されているスレッドで説明されている次の 1 つを Prolog に戻すことです。これには、適切な Prolog コールバックに到達するために、完了インターフェイスの設計を少し検討する必要があります。行全体とキャレットの位置の表現を渡して、キャレットから補完のリストを返す必要があると思います。これにより、誰でも独自のスマート コンプリータを作成できます。

于 2013-07-01T14:39:26.287 に答える