language link part of evaluator

This commit is contained in:
2022-06-13 15:10:44 +02:00
parent 81a483d540
commit ea5d318b62
3 changed files with 49 additions and 17 deletions

View File

@@ -1,13 +1,44 @@
import subprocess
import re
import time
import diplomat
class CarpProc:
def __init__(self):
self.proc = subprocess.Popen(['carp'])
self.proc = diplomat.Diplomat('carp')
self._version_info = None
self.adornment_re = re.compile(".\[33m.*?\[0m")
def wait_for_boot(self):
while not self.proc.output():
time.sleep(0.5)
return self
def version_info(self):
if not self._version_info:
self._version_info = list(self.proc.output_stream())[0].replace("Welcome to Carp ", "")[:-1]
return self._version_info
def read_output(self, old_output):
while self.proc.output() == old_output:
time.sleep(0.5)
res = self.adornment_re.sub("", self.proc.output()[len(old_output):]).strip()
if res.startswith("=> "):
return {'result': 'success', 'value': res[3:]}
if not res:
return {'result': 'success', 'value': '()'}
return {'result': 'error', 'value': res}
def evaluate(self, statements):
self.proc.stdin.send(statements)
assert self.proc.is_running(), "carp process has died"
if not self._version_info:
self.version_info()
old_output = self.proc.output()
self.proc._process.stdin.write(statements.encode("utf-8") + b"\n")
self.proc._process.stdin.flush()
return self.read_output(old_output)
def start_carp_proc():
return CarpProc()
return CarpProc().wait_for_boot()