Я пытаюсь создать ответный пролог, но иногда трудно узнать, когда ответ будет завершен или будет напечатано больше.
Я думаю, было бы проще, если бы я знал, когда исполняемый файл ожидает ввода данных пользователем или мог прочитать сообщение с подсказкой (что-то вроде 1 ?-
), но, очевидно, ни один из обработчиков событий не может его перехватить. Это мой код:
const pl = spawn('swipl', ['-l', 'db.pl'], {detached:true});
//pl.stderr.pipe(process.stderr);
//pl.stdout.pipe(process.stdout);
var messages=[]
var currentmsg;
var next=()=>{
console.log("next, messages left:",messages)
if(messages.length) pl.stdin.write(currentmsg=messages.shift());
else pl.stdin.write("halt.\n")
}
var last=[]
var arr=[]
function processlines(lines){
console.log("split",lines)
lines.forEach(x=>{
if(x.trim().endsWith('.')) {console.log("query returned",currentmsg);next()}
})
}
pl.stdin.on('data', (data) => {
console.log(`stdin: "${data}"`);
})
pl.stdout.on('data', (data) => {
console.log(`stdout: "${data}"`);
var s=data.toString()
processlines(s.split(/(?=\s[A-Z_][a-zA-Z0-9]*\s[=])|\r?\n/)) //split answer by variable
});
pl.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
if(data.toString().startsWith("ERROR")){console.log("error nothing in response");}
if(data.toString().trim().endsWith("?")) pl.stdin.write('n\n') //sometimes shows up
next() //initial header is an error message...
});
function query(s){
messages.push(s.trim()+'\n')
}
query("can_study_adv_ai.")
Контрольный пример
файл db.pl:
hod_says_so.
can_study_adv_ai:-has_studied_pascal.
can_study_adv_ai:-hod_says_so.
Выход:
next, messages left: [ 'can_study_adv_ai.\n', 'somethingelse.\n' ]
stderr: ERROR: Undefined procedure: has_studied_pascal/0
ERROR: In:
ERROR: [9] has_studied_pascal
ERROR: [8] can_study_adv_ai at c:/users/cravs/dropbox/currentproy/alogicpatterns/alogicpicat/db.pl:14
ERROR: [7] <user>
error nothing in response
next, messages left: [ 'somethingelse.\n' ] //here sending a command before previous was done.
stderr: Exception: (9) has_studied_pascal ? //sometimes shows up
next, messages left: []
Кто-нибудь знает, есть ли что-то, чего мне не хватает, чтобы поймать сообщение с подсказкой или способ узнать, когда процесс ожидает ввода?