Фраза_from_stream/2 без завершения (поток из http_open/3)

Я создаю приложение, используя Scryer Prolog, в котором есть компонент HTTP Client.

Было бы неплохо использовать потоковую передачу DCG для анализа данных, но фраза_from_stream/2 не завершается при использовании созданного потока из http_open/3.

Я ценю советы по отладке (как/где это не заканчивается?).

Шаги для воспроизведения в scryer-прологе верхнего уровня:

(Запустил простой локальный HTTP-сервер, используя python -m http.server 8000).

?- use_module(library(charsio)).
   true.
?- use_module(library(dcgs)).
   true.
?- use_module(library(http/http_open)).
   true.

% reading the entire stream before parsing works as expected:
?- http_open("http://127.0.0.1:8000", Stream, []), get_n_chars(Stream, N, Chars), phrase(seq(Data), Chars).
   Stream = '$stream'(0x600000636908), N = 726, Chars = "<!DOCTYPE HTML>\n<ht ...", Data = "<!DOCTYPE HTML>\n<ht ...".

?- use_module(library(pio)).
   true.

% phrase_from_stream/2 does not terminate in this case:
?- http_open("http://127.0.0.1:8000", Stream, []), phrase_from_stream(seq(Data), Stream).
% nontermination

Кажется, это происходит и с другими грамматическими правилами (изначально я пытаюсь проанализировать данные JSON), но я могу воспроизвести это с любым правилом. Я также безуспешно пытался унифицировать размер контента и установить заголовок Connection: close (используя параметры).

Аналогичный код с использованием SWI-Prolog работает как положено:

?- use_module(library(http/http_open)).
true.
?- use_module(library(dcg/basics)).
true.
?- use_module(library(pio)).
true.
?- http_open("http://127.0.0.1:8000", Stream, []), phrase_from_stream(string(Data), Stream).
Stream = <stream>(0x600002954400,0x600002974b00),
Data = [60, 33, 68, 79, 67, 84, 89, 80, 69|...] ;
false.

Полезное обсуждение этого вопроса на github.com/mthom/scryer-prolog/discussions/2437

brebs 05.07.2024 00:06

Советы по отладке рекламы: уменьшите размер http-документа, в который выполняется выборка, сначала на 0 байт, затем на 1 байт и т. д.

false 05.07.2024 15:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это была ошибка в Scryer Prolog, поскольку код потоковой передачи был неполным и всегда выдавал ответ, что входящих байтов больше, даже если это было не так.

С исправлением пиар

Другие вопросы по теме