Ввод / вывод потока SWI-Prolog и завершение табуляции в swipl-окне

Что я делаю

В настоящее время я работаю над созданием модуля SWI-Prolog, который добавляет возможность завершения табуляции в окно swipl-win. Пока что я действительно дошел до того, что он читает по одному символу за раз, не останавливая / не возвращая ничего, пока не будет набран символ табуляции. Я также уже написал предикат, который возвращает все возможные завершения неполностью типизированного термина с использованием сопоставления подстрок в списке текущих терминов (полученном с помощью current_functor/2, current_arithmetic_function/1, current_predicate/2 и т. Д. [Используемый предикат в конечном итоге будет основан на контексте] ).

Если вы хотите увидеть мой код, это здесь ... просто имейте в виду, что я еще не совсем мастер Prolog (дружеские советы более чем приветствуются).


О чем я думаю

Я понимаю, что когда я действительно реализую свой основной предикат завершения (еще не написанный), мне придется выяснить, какое последнее слово находится во входном потоке. Я обсуждаю, следует ли мне создавать новый поток со всем, что есть во входном потоке (так что мне не нужно менять позицию во входном потоке / возвращаться к началу) < strong> или напишите в строку ... если я воспользуюсь вторым подходом, я буду начинать со строки всякий раз, когда вводится ограничивающий символ (символы, начинающие новое слово, например, пробел, запятая, круглые скобки, операторы и т. д.), поэтому при каждом нажатии вкладки поиск в потоке не будет.

Однако есть еще одна вещь: когда пользователь просматривает и изменяет типизированный, но еще не отправленный запрос (с помощью клавиш со стрелками, возврата и т. Д.), для обработки завершения промежуточного потока необходим отдельный поток . Строка будет работать нормально, если завершение будет запрошено в конце потока (обработка обратного пробела так же проста, как отсечение последнего символа строки), но поскольку строка будет содержать только текущее слово, tabber.pl будет в потеря в таких случаях. Если, конечно, строка текущего слова не обновится и не найдет текущее слово, в котором находится курсор, когда пользователь перешел и набрал в середине потока ... (могу ли я использовать для этого at_end_of_stream(Stream)?)


Что я спрашиваю

Как вы думаете, мне следует подходить к этому (строка или поток)? Метод store-to-string и метод make-a-new-stream звучат так, будто каждый из них имеет свои преимущества, поэтому я Я почти уверен, что решением будет своего рода комбинация того и другого. Есть идеи, исправления или предложения по достижению моей цели? (каламбур)

Чтобы понять это и действительно сделать это правильно, я думаю, мне также нужно знать, как SWI-Prolog использует потоки ввода и вывода в окне swipl-win. (Очевидно, что он принимает ввод, но использует ли он выходной поток для записи в окно, когда вы вводите [во входной поток]?)


person ksoo    schedule 28.06.2013    source источник


Ответы (1)


Сделать это без изменения кода C, лежащего в основе консоли swipl-win.exe, будет сложно. Это также относится к ветке в списке рассылки, начинающейся здесь < / а>. Вызывающий завершение находится в src / pl-ntmain.c, do_complete () для Windows и src / os / pl-rl.c, prolog_completion () для автозавершения на основе строки чтения GNU, используемого в системах Unix.

Первый шаг, который нужно сделать, - это привести этих двоих и следующий, описанный в указанном потоке, обратно в Prolog с помощью обратного вызова. Это требует небольшого изучения дизайна интерфейсов завершения, чтобы прийти к подходящему обратному вызову Prolog. Я предполагаю, что это должно передать некоторое представление всей строки и местоположения каретки и вернуть список завершений из каретки. С этим каждый может написать свой собственный умный комплектующий.

person Jan Wielemaker    schedule 01.07.2013
comment
Вау, спасибо, мистер Вилемейкер! (Для меня большая честь получить ответ на один из моих вопросов от такой хорошо известной и почитаемой фигуры.) Есть ли способ использовать это, чтобы написать что-то, что можно было бы загрузить / добавить в SWI-Prolog (желательно, пока он работает) вместо того, чтобы компилировать мою собственную отдельную версию SWI-Prolog? (В противном случае я мог бы просто написать собственное окно консоли, которое будет просто интерфейсом для установки Prolog пользователя.) - person ksoo; 02.07.2013