diff options
author | Timotej Lazar <timotej.lazar@araneo.org> | 2015-08-28 17:44:51 +0200 |
---|---|---|
committer | Timotej Lazar <timotej.lazar@araneo.org> | 2015-08-28 17:44:51 +0200 |
commit | 29892da19ae7c1b2777f48bce4674262d2a19cef (patch) | |
tree | fce7e6007b7d9d8b9a8b6a26649a80ad8c6d0183 /server/prolog_session.py | |
parent | ad7c5dbfea7730150f9e749349bee4e3db12af84 (diff) |
Add a hint service for Prolog
Diffstat (limited to 'server/prolog_session.py')
-rw-r--r-- | server/prolog_session.py | 21 |
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') |