diff options
Diffstat (limited to 'c/pl.cpp')
-rw-r--r-- | c/pl.cpp | 39 |
1 files changed, 35 insertions, 4 deletions
@@ -1,9 +1,40 @@ #include <SWI-Prolog.h> +#include "defs.h" -int Pl(const char *szMod, const char *szPred) +Query::Query(module_t ctx, predicate_t p, term_t t0) +{ + m_q = PL_open_query(ctx, PL_Q_CATCH_EXCEPTION, p, t0); +} + +Query::~Query() +{ + PL_cut_query(m_q); +} + +int Query::Cut() +{ + if (PL_cut_query(m_q)) return 1; + if (term_t t = PL_exception(m_q)) throw t; + return 0; +} + +int Query::Close() +{ + if (PL_close_query(m_q)) return 1; + if (term_t t = PL_exception(m_q)) throw t; + return 0; +} + +int Query::NextSolution() +{ + if (PL_next_solution(m_q)) return 1; + if (term_t t = PL_exception(m_q)) throw t; + return 0; +} + +int Plx(const char *szMod, const char *szPred) { term_t t = PL_new_term_refs(0); - if (!PL_call_predicate(NULL, PL_Q_CATCH_EXCEPTION, PL_predicate(szPred, 0, szMod), t)) - return 0; - return 1; + Query q(NULL, PL_predicate(szPred, 0, szMod), t); + return q.NextSolution(); } |