This commit is contained in:
Vitor Santos Costa 2016-09-25 19:01:49 -05:00
parent 6802e83d83
commit e39b1e0127

View File

@ -0,0 +1,100 @@
from IPython.core.interactive import ExecutionResult
import yap
import sys
import syslog
import os
def yap_run_cell(self, s, store_history=True, silent=False,
shell_futures=True):
result = ExecutionResult()
if (not s) or s.isspace():
self.last_execution_succeeded = True
return result
if store_history:
result.execution_count = self.execution_count
def error_before_exec(value):
result.error_before_exec = value
self.last_execution_succeeded = False
return result
if not self.engine:
try:
self.engine = yap.Engine()
except:
return error_before_exec( sys.exc_info()[1])
if not self.q:
try:
self.q = self.engine.query(s)
except SyntaxError:
return error_before_exec( sys.exc_info()[1])
cell = s # cell has to exist so it can be stored/logged
# Store raw and processed history
# if not silent:
# self.logger.log(cell, s)
try:
f = io.StringIO()
with redirect_stdout(f):
goal = self.q.next()
print('{0}'.format(f.getvalue()))
# Execute the user code
has_raised = False
if goal:
myvs = self.q.namedVarsCopy()
if myvs:
i = 0
for peq in myvs:
name = peq[0]
bind = peq[1]
if bind.isVar():
var = yap.YAPAtom('$VAR')
f = yap.YAPFunctor(var, 1)
bind.unify(yap.YAPApplTerm(f, (name)))
else:
i = bind.numberVars(i, True)
print(name.text() + " = " + bind.text())
else:
print("yes")
if self.q.deterministic():
self.closeq()
else:
print("No (more) answers")
self.closeq()
except:
result.error_in_exec = sys.exc_info()[1]
# self.showtraceback()
has_raised = True
self.last_execution_succeeded = not has_raised
result.result = self.last_execution_succeeded
# Reset this so later displayed values do not modify the
# ExecutionResult
# self.displayhook.exec_result = None
#self.events.trigger('post_execute')
#if not silent:
# self.events.trigger('post_run_cell')
if store_history:
# Write output to the database. Does nothing unless
# history output logging is enabled.
# self.history_manager.store_output(self.execution_count)
# Each cell is a *single* input, regardless of how many lines it has
self.execution_count += 1
return result
def closeq(self):
if self.q:
self.q.close()
self.q = None