Как я могу прочитать сообщение с подсказкой или определить, когда порожденный процесс ожидает ввода в Node.js? - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь создать ответный пролог, но иногда трудно узнать, когда ответ будет завершен или будет напечатано больше.

Я думаю, было бы проще, если бы я знал, когда исполняемый файл ожидает ввода данных пользователем или мог прочитать сообщение с подсказкой (что-то вроде 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: []

Кто-нибудь знает, есть ли что-то, чего мне не хватает, чтобы поймать сообщение с подсказкой или способ узнать, когда процесс ожидает ввода?

...