Что я делаю
В настоящее время я работаю над созданием модуля 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. (Очевидно, что он принимает ввод, но использует ли он выходной поток для записи в окно, когда вы вводите [во входной поток]?)