summaryrefslogtreecommitdiff
path: root/server/prolog_session.py
diff options
context:
space:
mode:
authorTimotej Lazar <timotej.lazar@araneo.org>2015-08-28 17:44:51 +0200
committerTimotej Lazar <timotej.lazar@araneo.org>2015-08-28 17:44:51 +0200
commit29892da19ae7c1b2777f48bce4674262d2a19cef (patch)
treefce7e6007b7d9d8b9a8b6a26649a80ad8c6d0183 /server/prolog_session.py
parentad7c5dbfea7730150f9e749349bee4e3db12af84 (diff)
Add a hint service for Prolog
Diffstat (limited to 'server/prolog_session.py')
-rw-r--r--server/prolog_session.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/server/prolog_session.py b/server/prolog_session.py
index ff44a56..d83d62d 100644
--- a/server/prolog_session.py
+++ b/server/prolog_session.py
@@ -88,6 +88,27 @@ class PrologSession(object):
prolog.engine.destroy(self._engine_id)
self._engine_id = None
+ def hint(self, user_id, problem_id, program):
+ language, problem_group, problem = Problem.identifier(problem_id)
+
+ # If compilation fails just return compiler messages.
+ engine_id, output = prolog.engine.create(code=program)
+ if engine_id is not None:
+ prolog.engine.destroy(engine_id)
+ if 'error' in map(operator.itemgetter(0), output):
+ errors_msg = '\n'.join(['{}: {}'.format(m_type, m_text) for m_type, m_text in output])
+ return [{'id': 'syntax_error', 'args': {'messages': errors_msg}}]
+
+ # Otherwise try problem-specific hints.
+ problem_module = problems.load_problem(language, problem_group, problem, 'common')
+ if hasattr(problem_module, 'hint'):
+ hints = problem_module.hint(program)
+ if hints:
+ return hints
+
+ # Finally return a generic "try thinking a bit" message.
+ return [{'id': 'no_hint'}]
+
def test(self, user_id, problem_id, program):
language, problem_group, problem = Problem.identifier(problem_id)
problem_module = problems.load_problem(language, problem_group, problem, 'common')