trying to improve Python interface

This commit is contained in:
Vitor Santos Costa 2016-12-10 01:01:10 -06:00
parent 474fa2fe14
commit 70b11ab8f9
35 changed files with 592 additions and 19841 deletions

File diff suppressed because it is too large Load Diff

View File

View File

File diff suppressed because it is too large Load Diff

View File

@ -1,142 +0,0 @@
###################
### WARNING!!! ###
###################
# This file has been autogenerated
# Cython imports
from cython.operator cimport dereference as deref
from cython.operator cimport preincrement as inc
from libc cimport stdio
from cpython.version cimport PY_MAJOR_VERSION
from cpython.ref cimport PyTypeObject, Py_INCREF, Py_XDECREF
from cpython.type cimport PyType_Ready
from cpython.object cimport PyObject
from cpython.object cimport Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE
# Python imports
cimport numpy as np
# Local imports
cimport xdress_extra_types
# Cython imports for types
cdef extern from "Python.h":
ctypedef Py_ssize_t Py_ssize_t
cdef long Py_TPFLAGS_DEFAULT
cdef long Py_TPFLAGS_BASETYPE
cdef long Py_TPFLAGS_CHECKTYPES
cdef long Py_TPFLAGS_HEAPTYPE
ctypedef struct PyGetSetDef:
char * name
ctypedef struct PyTypeObject:
char * tp_name
int tp_basicsize
int tp_itemsize
object tp_alloc(PyTypeObject *, Py_ssize_t)
void tp_dealloc(object)
object tp_richcompare(object, object, int)
object tp_new(PyTypeObject *, object, object)
object tp_str(object)
object tp_repr(object)
long tp_hash(object)
long tp_flags
char * tp_doc
PyMemberDef * tp_members
PyGetSetDef * tp_getset
PyTypeObject * tp_base
void tp_free(void *)
# This is a dirty hack by declaring to Cython both the Python 2 & 3 APIs
int (*tp_compare)(object, object) # Python 2
void * (*tp_reserved)(object, object) # Python 3
# structmember.h isn't included in Python.h for some reason
cdef extern from "structmember.h":
ctypedef struct PyMemberDef:
char * name
int type
Py_ssize_t offset
int flags
char * doc
cdef extern from "numpy/arrayobject.h":
ctypedef object (*PyArray_GetItemFunc)(void *, void *)
ctypedef int (*PyArray_SetItemFunc)(object, void *, void *)
ctypedef void (*PyArray_CopySwapNFunc)(void *, np.npy_intp, void *, np.npy_intp, np.npy_intp, int, void *)
ctypedef void (*PyArray_CopySwapFunc)(void *, void *, int, void *)
ctypedef int (*PyArray_CompareFunc)(const void* d1, const void *, void *)
ctypedef int (*PyArray_ArgFunc)(void *, np.npy_intp, np.npy_intp *, void *)
ctypedef void (*PyArray_DotFunc)(void *, np.npy_intp, void *, np.npy_intp, void *, np.npy_intp, void *)
ctypedef int (*PyArray_ScanFunc)(stdio.FILE *, void *, void *, void *)
ctypedef int (*PyArray_FromStrFunc)(char *, void *, char **, void *)
ctypedef np.npy_bool (*PyArray_NonzeroFunc)(void *, void *)
ctypedef void (*PyArray_FillFunc)(void *, np.npy_intp, void *)
ctypedef void (*PyArray_FillWithScalarFunc)(void *, np.npy_intp, void *, void *)
ctypedef int (*PyArray_SortFunc)(void *, np.npy_intp, void *)
ctypedef int (*PyArray_ArgSortFunc)(void *, np.npy_intp *, np.npy_intp, void *)
ctypedef np.NPY_SCALARKIND (*PyArray_ScalarKindFunc)(np.PyArrayObject *)
ctypedef struct PyArray_ArrFuncs:
np.PyArray_VectorUnaryFunc ** cast
PyArray_GetItemFunc *getitem
PyArray_SetItemFunc *setitem
PyArray_CopySwapNFunc *copyswapn
PyArray_CopySwapFunc *copyswap
PyArray_CompareFunc *compare
PyArray_ArgFunc *argmax
PyArray_DotFunc *dotfunc
PyArray_ScanFunc *scanfunc
PyArray_FromStrFunc *fromstr
PyArray_NonzeroFunc *nonzero
PyArray_FillFunc *fill
PyArray_FillWithScalarFunc *fillwithscalar
PyArray_SortFunc *sort
PyArray_ArgSortFunc *argsort
PyObject *castdict
PyArray_ScalarKindFunc *scalarkind
int **cancastscalarkindto
int *cancastto
int listpickle
cdef void PyArray_InitArrFuncs(PyArray_ArrFuncs *)
ctypedef struct PyArray_ArrayDescr:
PyArray_Descr * base
PyObject *shape
cdef void ** PyArray_API
cdef PyTypeObject * PyArrayDescr_Type
ctypedef struct PyArray_Descr:
Py_ssize_t ob_refcnt
PyTypeObject * ob_type
PyTypeObject * typeobj
char kind
char type
char byteorder
int flags
int type_num
int elsize
int alignment
PyArray_ArrayDescr * subarray
PyObject * fields
PyObject * names
PyArray_ArrFuncs * f
cdef int PyArray_RegisterDataType(PyArray_Descr *)
cdef object PyArray_Scalar(void *, PyArray_Descr *, object)
cdef extern from "xdress_extra_types.h" namespace "xdress_extra_types":
cdef cppclass MemoryKnight[T]:
MemoryKnight() nogil except +
T * defnew() nogil except +
T * renew(void *) nogil except +
void deall(T *) nogil except +

View File

@ -1,43 +0,0 @@
###################
### WARNING!!! ###
###################
# This file has been autogenerated
# Cython imports
from cython.operator cimport dereference as deref
from cython.operator cimport preincrement as inc
from libc.stdlib cimport malloc, free
from libc.string cimport memcpy
from cpython.version cimport PY_MAJOR_VERSION
from cpython.ref cimport PyTypeObject
from cpython.type cimport PyType_Ready
from cpython.object cimport Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE
# Python Imports
import collections
cimport numpy as np
import numpy as np
np.import_array()
cimport xdress_extra_types
# Cython imports for types
# imports for types
dtypes = {}
if PY_MAJOR_VERSION >= 3:
basestring = str
# Dirty ifdef, else, else preprocessor hack
# see http://comments.gmane.org/gmane.comp.python.cython.user/4080
cdef extern from *:
cdef void emit_ifpy2k "#if PY_MAJOR_VERSION == 2 //" ()
cdef void emit_ifpy3k "#if PY_MAJOR_VERSION == 3 //" ()
cdef void emit_else "#else //" ()
cdef void emit_endif "#endif //" ()

File diff suppressed because it is too large Load Diff

View File

@ -1,30 +0,0 @@
###################
### WARNING!!! ###
###################
# This file has been autogenerated
# Cython imports
from cython.operator cimport dereference as deref
from cython.operator cimport preincrement as inc
from libcpp.string cimport string as std_string
from libcpp.utility cimport pair
from libcpp.map cimport map as cpp_map
from libcpp.set cimport set as cpp_set
from libcpp.vector cimport vector as cpp_vector
from libcpp cimport bool as cpp_bool
from libc cimport stdio
from cpython.version cimport PY_MAJOR_VERSION
from cpython.ref cimport PyTypeObject, Py_INCREF, Py_XDECREF
# Python Imports
cimport numpy as np
# Local imports
cimport xdress_extra_types
cimport numpy as np
# Cython Imports For Types

View File

@ -1,45 +0,0 @@
###################
### WARNING!!! ###
###################
# This file has been autogenerated
# Cython imports
from cython.operator cimport dereference as deref
from cython.operator cimport preincrement as inc
from libc.stdlib cimport malloc, free
from libc.string cimport memcpy
from libcpp.string cimport string as std_string
from libcpp.utility cimport pair
from libcpp.map cimport map as cpp_map
from libcpp.set cimport set as cpp_set
from libcpp cimport bool as cpp_bool
from libcpp.vector cimport vector as cpp_vector
from cpython.version cimport PY_MAJOR_VERSION
# Python Imports
import collections
cimport numpy as np
import numpy as np
np.import_array()
cimport xdress_extra_types
# Cython Imports For Types
# Imports For Types
if PY_MAJOR_VERSION >= 3:
basestring = str
# Dirty ifdef, else, else preprocessor hack
# see http://comments.gmane.org/gmane.comp.python.cython.user/4080
cdef extern from *:
cdef void emit_ifpy2k "#if PY_MAJOR_VERSION == 2 //" ()
cdef void emit_ifpy3k "#if PY_MAJOR_VERSION == 3 //" ()
cdef void emit_else "#else //" ()
cdef void emit_endif "#endif //" ()

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +0,0 @@
"""Tests the part of dtypes that is accessible from Python."""
###################
### WARNING!!! ###
###################
# This file has been autogenerated
from __future__ import print_function
import nose
from nose.tools import assert_equal, assert_not_equal, assert_raises, raises, \
assert_almost_equal, assert_true, assert_false, assert_in
from numpy.testing import assert_array_equal, assert_array_almost_equal
import os
import numpy as np
from _yap import dtypes
if __name__ == '__main__':
nose.run()

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +0,0 @@
"""Tests the part of stlconverters that is accessible from Python."""
###################
### WARNING!!! ###
###################
# This file has been autogenerated
from __future__ import print_function
from unittest import TestCase
import nose
from nose.tools import assert_equal, assert_not_equal, assert_raises, raises, \
assert_almost_equal, assert_true, assert_false, assert_in
from numpy.testing import assert_array_equal, assert_array_almost_equal
import os
import numpy as np
from collections import Container, Mapping
from _yap import stlcontainers
if __name__ == '__main__':
nose.run()

File diff suppressed because it is too large Load Diff

View File

@ -1,62 +0,0 @@
/// \file extra_types.h
/// \author Anthony Scopatz (scopatz\@gmail.com)
///
/// Provides some extra types that may be generally useful
#if !defined(_XDRESS_EXTRA_TYPES_)
#define _XDRESS_EXTRA_TYPES_
#if defined(__cplusplus)
namespace xdress_extra_types
{
/// complex type struct, matching PyTables definition
// typedef struct {
// double re; ///< real part
// double im; ///< imaginary part
// } complex_t;
/// Chivalrously handles C++ memory issues that Cython does
/// not yet have a syntax for. This is a template class,
/// rather than three template functions, because Cython does
/// not yet support template function wrapping.
template <class T>
class MemoryKnight
{
public:
MemoryKnight(){}; ///< Default constructor
~MemoryKnight(){}; ///< Default Destructor
/// Creates a new instance of type T on the heap using
/// its default constructor.
/// \return T *
T * defnew(){return new T();};
/// Creates a new instance of type T, using T's default
/// constructor, at a given location.
/// \param void * ptr, location to create T instance
/// \return value of ptr recast as T *
T * renew(void * ptr){return new (ptr) T();};
/// Deallocates a location in memory using delete.
/// \param T * ptr, location to remove
void deall(T * ptr){delete ptr;};
};
// End namespace xdress_extra_types
};
#elif defined(__STDC__)
// de nada
#endif
/// complex type struct, matching PyTables definition
typedef struct {
double re; ///< real part
double im; ///< imaginary part
} xd_complex_t;
#endif

View File

@ -1,45 +0,0 @@
"""C++ wrapper for extra types header."""
from libc.stdio cimport FILE
# Dirty ifdef, else, else preprocessor hack
# see http://comments.gmane.org/gmane.comp.python.cython.user/4080
cdef extern from *:
cdef void emit_ifc "#if defined(__STDC__) //" ()
cdef void emit_ifcpp "#if defined(__cplusplus) //" ()
cdef void emit_elifc "#elif defined(__STDC__) //" ()
cdef void emit_elifcpp "#elif defined(__cplusplus) //" ()
cdef void emit_else "#else //" ()
cdef void emit_endif "#endif //" ()
ctypedef unsigned char uchar
ctypedef long long int64
ctypedef unsigned short uint16
ctypedef unsigned int uint32
ctypedef unsigned long long uint64
ctypedef long double float128
cdef extern from "xdress_extra_types.h":
ctypedef struct complex_t "xd_complex_t":
double re
double im
cdef complex_t py2c_complex(object pyv)
cdef extern from "Python.h":
object PyFile_FromFile(FILE *fp, char *name, char *mode, int (*close)(FILE*))
FILE* PyFile_AsFile(object p)
#emit_ifcpp()
#cdef extern from "<exception>" namespace "std":
# cdef cppclass exception:
# exception()
# exception(const exception&)
# exception& operator= (const exception&)
# ~exception()
# const char * what()
#emit_endif()

View File

@ -1,12 +0,0 @@
#
# This file has been autogenerated by xdress
#
cdef complex_t py2c_complex(object pyv):
cdef complex_t cv = complex_t(0, 0)
pyv = complex(pyv)
cv.re = pyv.real
cv.im = pyv.imag
return cv

View File

@ -137,8 +137,10 @@ protected:
CACHE_REGS
BACKUP_MACHINE_REGS();
Term *modp = NULL;
out = Yap_StringToTerm(s0, strlen(s0) + 1, &LOCAL_encoding, 1200, names);
names = MkVarTerm ();
const unsigned char *us = (const unsigned char *)s0;
out =
Yap_BufferToTermWithPrioBindings(us, strlen(s0), TermNil, 1200, names);
// extern char *s0;
// fprintf(stderr,"ap=%p arity=%d text=%s", ap, ap->ArityOfPE, s);
// Yap_DebugPlWrite(out);
@ -217,13 +219,15 @@ public:
/// char */module constructor for predicates.
///
inline YAPPredicate(const char *at, uintptr_t arity) {
ap = RepPredProp(PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(at), arity), CurrentModule));
ap = RepPredProp(PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(at), arity),
CurrentModule));
};
/// char */module constructor for predicates.
///
inline YAPPredicate(const char *at, uintptr_t arity, YAPTerm mod) {
ap = RepPredProp(PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(at), arity), mod.t));
ap = RepPredProp(
PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(at), arity), mod.t));
};
/// char */module constructor for predicates.
@ -266,8 +270,8 @@ public:
*/
class YAPPrologPredicate : public YAPPredicate {
public:
YAPPrologPredicate(YAPTerm t) : YAPPredicate(t) {};
YAPPrologPredicate(const char *s, arity_t arity): YAPPredicate(s, arity) {};
YAPPrologPredicate(YAPTerm t) : YAPPredicate(t){};
YAPPrologPredicate(const char *s, arity_t arity) : YAPPredicate(s, arity){};
/// add a new clause
void *assertClause(YAPTerm clause, bool last = true,
YAPTerm source = YAPTerm());

View File

@ -162,6 +162,8 @@ YAPApplTerm::YAPApplTerm(YAPFunctor f, YAPTerm ts[]) : YAPTerm() {
RECOVER_H();
}
#if 0
YAPApplTerm::YAPApplTerm(const char *f, std::vector<YAPTerm> ts) : YAPTerm() {
BACKUP_H();
arity_t arity = ts.size();
@ -179,29 +181,32 @@ YAPApplTerm::YAPApplTerm(YAPFunctor f) : YAPTerm() {
mk(Yap_MkNewApplTerm(f.f, arity));
RECOVER_H();
}
#endif
YAPFunctor YAPApplTerm::getFunctor() { return YAPFunctor(FunctorOfTerm(gt())); }
YAPTerm &YAPTerm::operator[](arity_t i) {
Term &YAPTerm::operator[](arity_t i) {
BACKUP_MACHINE_REGS();
Term t0 = gt();
Term tf = 0;
if (IsApplTerm(t0)) {
Functor f = FunctorOfTerm(t0);
if (IsExtensionFunctor(f))
return *new YAPTerm();
tf = ArgOfTerm(i + 1, t0);
// Functor f = FunctorOfTerm(t0);
// if (IsExtensionFunctor(f))
// return 0;
RECOVER_MACHINE_REGS();
return RepAppl(t0)[(i + 1)];
} else if (IsPairTerm(t0)) {
if (i == 0)
tf = HeadOfTerm(t0);
else if (i == 1)
tf = TailOfTerm(t0);
RECOVER_MACHINE_REGS();
return RepPair(tf)[i];
}
RECOVER_MACHINE_REGS();
return *new YAPTerm(tf);
}
YAPTerm &YAPListTerm::operator[](arity_t i) {
Term &YAPListTerm::operator[](arity_t i) {
BACKUP_MACHINE_REGS();
Term t0 = gt();
Term tf = 0;
@ -215,7 +220,7 @@ YAPTerm &YAPListTerm::operator[](arity_t i) {
}
}
RECOVER_MACHINE_REGS();
return *new YAPTerm(tf);
return RepPair(tf)[i];
}
YAPPairTerm::YAPPairTerm(YAPTerm th, YAPTerm tl) : YAPTerm() {
@ -231,11 +236,6 @@ YAPPairTerm::YAPPairTerm() : YAPTerm() {
RECOVER_H();
}
Term YAPTerm::gt() { CACHE_REGS return Yap_GetFromSlot(t); }
void YAPTerm::mk(Term t0) { CACHE_REGS t= Yap_InitSlot(t0); }
YAP_tag_t YAPTerm::tag() {
Term tt = gt();
if (IsVarTerm(tt)) {
@ -280,24 +280,24 @@ YAP_tag_t YAPTerm::tag() {
}
}
YAPTerm YAPTerm::deepCopy() {
Term YAPTerm::deepCopy() {
yhandle_t tn;
BACKUP_MACHINE_REGS();
tn = Yap_CopyTerm(gt());
RECOVER_MACHINE_REGS();
return *new YAPTerm(tn);
return (tn);
}
YAPListTerm YAPListTerm::dup() {
Term YAPListTerm::dup() {
yhandle_t tn;
BACKUP_MACHINE_REGS();
tn = Yap_CopyTerm(gt());
RECOVER_MACHINE_REGS();
return *new YAPListTerm(tn);
return tn;
}
intptr_t YAPTerm::numberVars(intptr_t i0, bool skip_singletons) {
@ -309,77 +309,7 @@ intptr_t YAPTerm::numberVars(intptr_t i0, bool skip_singletons) {
return i;
}
bool YAPTerm::exactlyEqual(YAPTerm t1) {
bool out;
BACKUP_MACHINE_REGS();
out = Yap_eq(gt(), t1.term());
RECOVER_MACHINE_REGS();
return out;
}
bool YAPTerm::unify(YAPTerm t1) {
intptr_t out;
BACKUP_MACHINE_REGS();
out = Yap_unify(gt(), t1.term());
RECOVER_MACHINE_REGS();
return out;
}
bool YAPTerm::unifiable(YAPTerm t1) {
intptr_t out;
BACKUP_MACHINE_REGS();
out = Yap_Unifiable(gt(), t1.term());
RECOVER_MACHINE_REGS();
return out;
}
bool YAPTerm::variant(YAPTerm t1) {
intptr_t out;
BACKUP_MACHINE_REGS();
out = Yap_Variant(gt(), t1.term());
RECOVER_MACHINE_REGS();
return out;
}
intptr_t YAPTerm::hashTerm(size_t sz, size_t depth, bool variant) {
intptr_t out;
BACKUP_MACHINE_REGS();
out = Yap_TermHash(gt(), sz, depth, variant);
RECOVER_MACHINE_REGS();
return out;
}
const char *YAPTerm::text() {
CACHE_REGS
size_t length = 0;
encoding_t enc = LOCAL_encoding;
char *os;
BACKUP_MACHINE_REGS();
if (!(os = Yap_TermToString(Yap_GetFromSlot(t), &length, enc,
Handle_vars_f))) {
RECOVER_MACHINE_REGS();
return 0;
}
RECOVER_MACHINE_REGS();
length = strlen(os) + 1;
char *sm = (char *)malloc(length + 1);
strcpy(sm, os);
return sm;
}
const char *YAPQuery::text() { return goal.text(); }
const char *YAPQuery::text() { return YAPTerm(goal).text(); }
YAPIntegerTerm::YAPIntegerTerm(intptr_t i) {
CACHE_REGS Term tn = MkIntegerTerm(i);
@ -402,17 +332,16 @@ YAPTerm::YAPTerm(void *ptr) {
mk(MkIntegerTerm((Int)ptr));
}
YAPTerm YAPListTerm::car() {
Term YAPListTerm::car() {
Term to = gt();
if (IsPairTerm(to))
return YAPTerm(HeadOfTerm(to));
return (HeadOfTerm(to));
else {
Yap_Error(TYPE_ERROR_LIST, to, "");
throw YAPError();
}
}
YAPListTerm::YAPListTerm(YAPTerm ts[], arity_t n) {
CACHE_REGS
BACKUP_H();
@ -437,40 +366,34 @@ YAPVarTerm::YAPVarTerm() {
mk(MkVarTerm());
}
const char *YAPAtom::getName(void) {
return Yap_AtomToUTF8Text( a, nullptr );
}
const char *YAPAtom::getName(void) { return Yap_AtomToUTF8Text(a, nullptr); }
void YAPQuery::openQuery() {
CACHE_REGS
arity_t arity = ap->ArityOfPE;
if (arity) {
Term *ts;
Term t = goal.term();
if (IsPairTerm(t)) {
ts = RepPair(t);
} else {
ts = RepAppl(t) + 1;
}
for (arity_t i = 0; i < arity; i++) {
XREGS[i + 1] = ts[i];
}
}
// oq = LOCAL_execution;
// LOCAL_execution = this;
q_open = true;
q_state = 0;
q_flags = true; // PL_Q_PASS_EXCEPTION;
q_p = P;
q_cp = CP;
// make sure this is safe
q_handles = Yap_StartSlots();
void YAPQuery::openQuery() {
CACHE_REGS
arity_t arity = ap->ArityOfPE;
if (arity) {
Term *ts;
Term t = goal;
if (IsPairTerm(t)) {
ts = RepPair(t);
} else {
ts = RepAppl(t) + 1;
}
for (arity_t i = 0; i < arity; i++) {
XREGS[i + 1] = ts[i];
}
}
// oq = LOCAL_execution;
// LOCAL_execution = this;
q_open = true;
q_state = 0;
q_flags = true; // PL_Q_PASS_EXCEPTION;
q_p = P;
q_cp = CP;
// make sure this is safe
q_handles = Yap_StartSlots();
}
bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) {
CACHE_REGS
@ -496,15 +419,12 @@ bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) {
return false;
}
// don't forget, on success these bindings will still be there);
YAP_LeaveGoal(false, &q);
YAP_LeaveGoal(false, &q);
RECOVER_MACHINE_REGS();
return result;
}
bool YAPEngine::goalt(YAPTerm Yt) {
return Yt.term();
}
bool YAPEngine::goalt(YAPTerm Yt) { return Yt.term(); }
bool YAPEngine::goal(Term t) {
CACHE_REGS
@ -538,7 +458,6 @@ bool YAPEngine::goal(Term t) {
// don't forget, on success these guys may create slots
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec ");
result = (bool)YAP_EnterGoal(ap, nullptr, &q);
if ((terr = Yap_GetException())) {
YAP_LeaveGoal(false, &q);
@ -558,27 +477,26 @@ bool YAPEngine::goal(Term t) {
void YAPEngine::release() {
BACKUP_MACHINE_REGS();
YAP_LeaveGoal(FALSE, &q);
YAP_LeaveGoal(FALSE, &q);
RECOVER_MACHINE_REGS();
}
}
Term YAPEngine::fun(Term t) {
CACHE_REGS
BACKUP_MACHINE_REGS();
Term tmod = CurrentModule, *ts = nullptr;
PredEntry *ap ;
PredEntry *ap;
arity_t arity;
Functor f;
jmp_buf q_env;
Atom name;
BACKUP_MACHINE_REGS();
if (IsApplTerm(t)) {
if (IsApplTerm(t)) {
ts = RepAppl(t) + 1;
f = (Functor)ts[-1];
name = NameOfFunctor(f);
arity =ArityOfFunctor(f);
name = NameOfFunctor(f);
arity = ArityOfFunctor(f);
for (arity_t i = 0; i < arity; i++)
XREGS[i + 1] = ts[i];
} else if (IsAtomTerm(t)) {
@ -592,14 +510,14 @@ Term YAPEngine::fun(Term t) {
name = AtomDot;
f = FunctorDot;
} else {
Yap_Error(TYPE_ERROR_CALLABLE, t, 0);
return 0L;
}
XREGS[arity+1] = MkVarTerm();
arity ++;
f = Yap_MkFunctor(name,arity);
ap = (PredEntry *)(PredPropByFunc(f,tmod));
q.CurSlot = Yap_StartSlots();
Yap_Error(TYPE_ERROR_CALLABLE, t, 0);
return 0L;
}
XREGS[arity + 1] = MkVarTerm();
arity++;
f = Yap_MkFunctor(name, arity);
ap = (PredEntry *)(PredPropByFunc(f, tmod));
q.CurSlot = Yap_StartSlots();
q.p = P;
q.cp = CP;
// make sure this is safe
@ -607,7 +525,7 @@ Term YAPEngine::fun(Term t) {
if (setjmp(q_env)) {
Term terr;
if ((terr = Yap_PeekException())) {
if ((terr = Yap_PeekException())) {
YAP_LeaveGoal(false, &q);
Yap_CloseHandles(q.CurSlot);
throw YAPError();
@ -616,13 +534,13 @@ Term YAPEngine::fun(Term t) {
}
// don't forget, on success these guys may create slots
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec ");
if ((o = (Term)YAP_EnterGoal(ap, nullptr, &q))==0)
if ((o = (Term)YAP_EnterGoal(ap, nullptr, &q)) == 0)
return 0;
Term terr;
if ((terr = Yap_GetException())) {
YAP_LeaveGoal(false, &q);
Yap_CloseHandles(q.CurSlot);
Yap_CloseHandles(q.CurSlot);
throw YAPError();
}
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "out %ld", o);
@ -641,41 +559,43 @@ YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[])
: YAPPredicate(f, mod) {
/* ignore flags for now */
BACKUP_MACHINE_REGS();
goal = YAPApplTerm(f, ts);
vnames = YAPListTerm();
goal = YAPApplTerm(f, ts).gt();
names = TermNil;
openQuery();
RECOVER_MACHINE_REGS();
}
#if 0
YAPQuery::YAPQuery(YAPFunctor f, YAPTerm ts[]) : YAPPredicate(f) {
/* ignore flags for now */
/* ignore flags for now */
BACKUP_MACHINE_REGS();
goal = YAPApplTerm(f, ts);
vnames = YAPListTerm();
goal = YAPApplTerm(f, ts).gt();
names = TermNil;
openQuery();
RECOVER_MACHINE_REGS();
}
#endif
YAPQuery::YAPQuery(YAPPredicate p, YAPTerm ts[]) : YAPPredicate(p.ap) {
BACKUP_MACHINE_REGS();
goal = YAPApplTerm(YAPFunctor(ap->FunctorOfPred), ts);
vnames = YAPListTerm();
goal = YAPApplTerm(YAPFunctor(p.ap->FunctorOfPred), ts).term();
names = TermNil;
openQuery();
RECOVER_MACHINE_REGS();
}
YAPListTerm YAPQuery::namedVars() {
Term YAPQuery::namedVars() {
CACHE_REGS
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %s %ld",
vnames.text(), LOCAL_CurSlot);
return vnames; // should be o
names.text(), LOCAL_CurSlot);
return (names); // should be o
}
YAPListTerm YAPQuery::namedVarsCopy() {
Term YAPQuery::namedVarsCopy() {
CACHE_REGS
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %s %ld",
vnames.text(), LOCAL_CurSlot);
return YAPListTerm(YAP_CopyTerm(vnames.term())); // should be o
__android_log_print(NDROID_LOG_INFO, "YAPDroid", "vnames %s %ld",
names.text(), LOCAL_CurSlot);
return (YAP_CopyTerm(names)); // should be o
}
bool YAPQuery::next() {
@ -847,8 +767,7 @@ void YAPEngine::doInit(YAP_file_type_t BootMode) {
YAPEngine::YAPEngine(char *savedState, char *bootFile, size_t stackSize,
size_t trailSize, size_t maxStackSize, size_t maxTrailSize,
char *libDir, char *goal, char *topLevel, bool script,
bool fastBoot,
bool embedded,
bool fastBoot, bool embedded,
YAPCallback *cb)
: _callback(0) { // a single engine can be active
@ -976,12 +895,12 @@ void *YAPPrologPredicate::assertClause(YAPTerm cl, bool last, YAPTerm source) {
void *YAPPrologPredicate::assertFact(YAPTerm *cl, bool last) {
CACHE_REGS
arity_t i;
arity_t i;
RECOVER_MACHINE_REGS();
Term tt = AbsAppl(HR);
*HR++ = (CELL)(ap->FunctorOfPred);
for (i = 0; i < ap->ArityOfPE; i++,cl++)
*HR++ = cl->gt();
for (i = 0; i < ap->ArityOfPE; i++, cl++)
*HR++ = cl->gt();
yamop *codeaddr = Yap_cclause(tt, ap->ArityOfPE, Yap_CurrentModule(),
tt); /* vsc: give the number of arguments
to cclause in case there is overflow */
@ -1046,23 +965,21 @@ const char *YAPError::text() {
return s.c_str();
}
void YAPEngine::reSet()
{
void YAPEngine::reSet() {
/* ignore flags for now */
BACKUP_MACHINE_REGS();
Yap_RebootHandles(worker_id);
while (B->cp_b) B= B->cp_b;
P = FAILCODE;
Yap_exec_absmi(true, YAP_EXEC_ABSMI);
/* recover stack space */
HR = B->cp_h;
TR = B->cp_tr;
while (B->cp_b)
B = B->cp_b;
P = FAILCODE;
Yap_exec_absmi(true, YAP_EXEC_ABSMI);
/* recover stack space */
HR = B->cp_h;
TR = B->cp_tr;
#ifdef DEPTH_LIMIT
DEPTH = B->cp_depth;
DEPTH = B->cp_depth;
#endif /* DEPTH_LIMIT */
YENV = ENV = B->cp_env;
YENV = ENV = B->cp_env;
RECOVER_MACHINE_REGS();
}
}

View File

@ -22,10 +22,9 @@ class YAPQuery : public YAPPredicate {
int q_flags;
YAP_dogoalinfo q_h;
YAPQuery *oq;
YAPListTerm vnames;
YAPTerm goal;
Term names;
Term goal;
// temporaries
Term tgoal, names;
void openQuery();
@ -46,21 +45,19 @@ public:
///
/// It is given a functor, and an array of terms that must have at least
/// the same arity as the functor. Works within the current module.
YAPQuery(YAPFunctor f, YAPTerm t[]);
//YAPQuery(YAPFunctor f, YAPTerm t[]);
/// string constructor without varnames
///
/// It is given a string, calls the parser and obtains a Prolog term that
/// should be a callable
/// goal.
inline YAPQuery(const char *s) : YAPPredicate(s, tgoal, names) {
inline YAPQuery(const char *s) : YAPPredicate(s, goal, names) {
BACKUP_H();
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %ld",
LOCAL_CurSlot);
if (!ap)
return;
goal = YAPTerm(tgoal);
vnames = YAPListTerm(names);
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", vnames.text());
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", vnames.text());
openQuery();
RECOVER_H();
};
@ -69,8 +66,8 @@ public:
/// It is given an atom, and a Prolog term that should be a callable
/// goal, say `main`, `init`, `live`.
inline YAPQuery(YAPAtom g) : YAPPredicate(g) {
goal = YAPAtomTerm(g);
vnames = YAPListTerm();
goal = YAPAtomTerm(g).gt();
names = TermNil;
openQuery();
};
@ -96,9 +93,9 @@ public:
/// finish the current query: undo all bindings.
void close();
/// query variables.
YAPListTerm namedVars();
Term namedVars();
/// query variables, but copied out
YAPListTerm namedVarsCopy();
Term namedVarsCopy();
/// convert a ref to a binding.
YAPTerm getTerm(yhandle_t t);
/// simple YAP Query;

View File

@ -2,9 +2,23 @@
#ifndef YAPT_HH
#define YAPT_HH 1
extern "C" Term YAP_ReadBuffer(const char *s, Term *tp);
#include "config.h"
extern "C" {
Term YAP_ReadBuffer(const char *s, Term *tp);
#if defined(SWIGPYTHON) && 0
#include <Python.h>
extern Term pythonToYAP(PyObject *inp);
#define YAPTerm _YAPTERM
#elifndef HAVE_PYTHON_H
typdef struct { int no_python; } PyObject;
#else
#include <Python.h>
#endif
};
class YAPError;
/**
* @brief Generic Prolog Term
*/
@ -18,20 +32,41 @@ class YAPTerm {
friend class YAPListTerm;
protected:
yhandle_t t; /// handle to term, equivalent to term_t
void mk(Term t0); /// internal method to convert from term to handle
Term gt(); /// get handle and obtain term
yhandle_t t; /// handle to term, equivalent to term_t
public:
virtual ~YAPTerm(){ LOCAL_HandleBase[t] = TermFreeTerm;
while ( LOCAL_HandleBase[LOCAL_CurSlot-1] == TermFreeTerm)
LOCAL_CurSlot--;
}
YAPTerm(Term tn) {
mk(tn);
} /// private method to convert from Term (internal YAP representation) to
virtual ~YAPTerm() {
// fprintf(stderr,"-%d,%lx,%p ",t,LOCAL_HandleBase[t] ,HR);
// Yap_DebugPlWriteln(LOCAL_HandleBase[t]); }
// LOCAL_HandleBase[t] = TermFreeTerm;
// while ( LOCAL_HandleBase[LOCAL_CurSlot-1] == TermFreeTerm)
LOCAL_CurSlot--;
};
Term gt() {
CACHE_REGS
// fprintf(stderr,"?%d,%lx,%p\n",t,LOCAL_HandleBase[t], HR);
// Yap_DebugPlWriteln(LOCAL_HandleBase[t]);
return Yap_GetFromSlot(t);
};
void mk(Term t0) {
CACHE_REGS t = Yap_InitSlot(t0);
// fprintf(stderr,"+%d,%lx,%p,%p",t,t0,HR,ASP); Yap_DebugPlWriteln(t0);
};
YAPTerm(Term tn) { mk(tn); };
YAPTerm(PyObject *inp) {
#ifdef SWIGPYTHON
Term tinp = pythonToYAP(inp);
t = Yap_InitSlot(tinp);
#else
t = 0;
#endif
}
/// private method to convert from Term (internal YAP representation) to
/// YAPTerm
// do nothing constructor
YAPTerm() { mk(MkVarTerm()); }
YAPTerm() { mk(MkVarTerm()); };
// YAPTerm(yhandle_t i) { t = i; };
/// pointer to term
YAPTerm(void *ptr);
@ -51,23 +86,64 @@ public:
/// extract the tag of a term, after dereferencing.
YAP_tag_t tag();
/// copy the term ( term copy )
YAPTerm deepCopy();
Term deepCopy();
/// numbervars ( int start, bool process=false )
intptr_t numberVars(intptr_t start, bool skip_singletons = false);
inline Term term() {
return gt();
} /// from YAPTerm to Term (internal YAP representation)
inline void bind(Term b) { LOCAL_HandleBase[t] = b; }
inline void bind(YAPTerm *b) { LOCAL_HandleBase[t] = b->term(); }
/// from YAPTerm to Term (internal YAP representation)
/// fetch a sub-term
YAPTerm &operator[](size_t n);
Term &operator[](size_t n);
// const YAPTerm *vars();
/// this term is == to t1
virtual bool exactlyEqual(YAPTerm t1);
virtual bool unify(YAPTerm t1); /// t = t1
virtual bool unifiable(YAPTerm t1); /// we can unify t and t1
virtual bool variant(
YAPTerm t1); /// t =@= t1, the two terms are equal up to variable renaming
virtual intptr_t hashTerm(size_t sz, size_t depth,
bool variant); /// term hash,
virtual bool exactlyEqual(YAPTerm t1) {
bool out;
BACKUP_MACHINE_REGS();
out = Yap_eq(gt(), t1.term());
RECOVER_MACHINE_REGS();
return out;
};
/// t = t1
virtual bool unify(YAPTerm t1) {
intptr_t out;
BACKUP_MACHINE_REGS();
out = Yap_unify(gt(), t1.term());
RECOVER_MACHINE_REGS();
return out;
};
/// we can unify t and t1
virtual bool unifiable(YAPTerm t1) {
bool out;
BACKUP_MACHINE_REGS();
out = Yap_eq(gt(), t1.term());
RECOVER_MACHINE_REGS();
return out;
};
/// t =@= t1, the two terms are equal up to variable renamingvirtual bool
/// variant(
inline virtual YAP_Term variant(YAPTerm t1) {
intptr_t out;
BACKUP_MACHINE_REGS();
out = Yap_Variant(gt(), t1.term());
RECOVER_MACHINE_REGS();
return out;
};
virtual intptr_t hashTerm(size_t sz, size_t depth, bool variant) {
intptr_t out;
BACKUP_MACHINE_REGS();
out = Yap_TermHash(gt(), sz, depth, variant);
RECOVER_MACHINE_REGS();
return out;
};
/// term hash,
virtual bool isVar() { return IsVarTerm(gt()); } /// type check for unound
virtual bool isAtom() { return IsAtomTerm(gt()); } /// type check for atom
virtual bool isInteger() {
@ -88,19 +164,19 @@ public:
virtual bool isList() { return Yap_IsListTerm(gt()); } /// term is a list
/// extract the argument i of the term, where i in 1...arity
virtual YAPTerm getArg(arity_t i) {
virtual Term getArg(arity_t i) {
BACKUP_MACHINE_REGS();
Term tf = 0;
Term t0 = gt();
YAPTerm tf;
if (IsApplTerm(t0))
tf = YAPTerm(ArgOfTerm(i, t0));
tf = (ArgOfTerm(i, t0));
else if (IsPairTerm(t0)) {
if (i == 1)
tf = YAPTerm(HeadOfTerm(t0));
tf = (HeadOfTerm(t0));
else if (i == 2)
tf = YAPTerm(TailOfTerm(t0));
tf = (TailOfTerm(t0));
} else {
tf = YAPTerm((Term)0);
tf = ((Term)0);
}
RECOVER_MACHINE_REGS();
return tf;
@ -123,7 +199,24 @@ public:
}
/// return a string with a textual representation of the term
virtual const char *text();
virtual const char *text(){
CACHE_REGS
size_t length = 0;
encoding_t enc = LOCAL_encoding;
char *os;
BACKUP_MACHINE_REGS();
if (!(os = Yap_TermToString(Yap_GetFromSlot(t), &length, enc,
Handle_vars_f))) {
RECOVER_MACHINE_REGS();
return 0;
}
RECOVER_MACHINE_REGS();
length = strlen(os) + 1;
char *sm = (char *)malloc(length + 1);
strcpy(sm, os);
return sm;
};
/// return a handle to the term
inline yhandle_t handle() { return t; };
@ -170,15 +263,15 @@ class YAPApplTerm : public YAPTerm {
public:
~YAPApplTerm() {}
YAPApplTerm(YAPFunctor f, YAPTerm ts[]);
YAPApplTerm(const char *s, std::vector<YAPTerm> ts);
YAPApplTerm(YAPFunctor f);
YAPApplTerm(YAPFunctor f, YAPTerm ts[]);
//YAPApplTerm(const char *s, std::vector<YAPTerm> ts);
//YAPApplTerm(YAPFunctor f);
YAPFunctor getFunctor();
YAPTerm getArg(arity_t i) {
Term getArg(arity_t i) {
BACKUP_MACHINE_REGS();
Term t0 = gt();
YAPTerm tf;
tf = YAPTerm(ArgOfTerm(i, t0));
Term tf;
tf = ArgOfTerm(i, t0);
RECOVER_MACHINE_REGS();
return tf;
};
@ -209,8 +302,8 @@ class YAPPairTerm : public YAPTerm {
public:
YAPPairTerm(YAPTerm hd, YAPTerm tl);
YAPPairTerm();
YAPTerm getHead() { return YAPTerm(HeadOfTerm(gt())); }
YAPTerm getTail() { return YAPTerm(TailOfTerm(gt())); }
Term getHead() { return (HeadOfTerm(gt())); }
Term getTail() { return (TailOfTerm(gt())); }
};
/**
@ -267,20 +360,20 @@ public:
return Yap_SkipList(&t1, &tailp);
}
/// Extract the nth element.
YAPTerm &operator[](size_t n);
Term &operator[](size_t n);
/// Extract the first element of a list.
///
/// @param[in] the list
YAPTerm car();
Term car();
/// Extract the tail elements of a list.
///
/// @param[in] the list
YAPListTerm cdr() {
Term cdr() {
Term to = gt();
if (IsPairTerm(to))
return YAPListTerm(TailOfTerm(to));
return (TailOfTerm(to));
else if (to == TermNil)
return YAPListTerm();
return TermNil;
/* error */
Yap_Error(TYPE_ERROR_LIST, t, 0);
throw YAPError();
@ -288,7 +381,7 @@ public:
/// copy a list.
///
/// @param[in] the list
YAPListTerm dup();
Term dup();
/// Check if the list is empty.
///

View File

@ -5,13 +5,11 @@ if (PYTHONLIBS_FOUND)
include(FindPythonModule)
set (PYTHON_SOURCES
python.c pl2py.c pybips.c py2pl.c pl2pl.c pypreds.c )
include("${CMAKE_SOURCE_DIR}/packages/python/Sources.cmake")
add_library (YAPPython SHARED ${PYTHON_SOURCES})
set (PYTHON_HEADERS
python.h)
target_link_libraries(YAPPython libYap ${PYTHON_LIBRARIES})

View File

@ -3,7 +3,7 @@
#include "python.h"
PyObject *yap_to_python(YAP_Term t, bool eval) {
term_t yt = PL_new_term_ref();
term_t yt = YAP_InitSlot(t);
PyObject *o = term_to_python(yt, eval);
PL_reset_term_refs(yt);
return o;
@ -18,23 +18,14 @@ PyObject *yap_to_python(YAP_Term t, bool eval) {
* @return a Python object descriptor or NULL if failed
*/
PyObject *term_to_python(term_t t, bool eval) {
// Yap_DebugPlWrite(YAP_GetFromSlot(t)); fprintf(stderr, " here I
// Yap_DebugPlWritep(YAP_GetFromSlot(t)); fprintf(stderr, " here I
YAP_Term yt = YAP_GetFromSlot(t);
switch (PL_term_type(t)) {
case PL_VARIABLE: {
PyObject *o = NULL, *pArgs;
if (eval)
return NULL;
if (PyObject_HasAttrString(py_Main, "V"))
o = PyObject_GetAttrString(py_Main, "V");
if (!o && PyObject_HasAttrString(py_Yapex, "V"))
o = PyObject_GetAttrString(py_Yapex, "V");
if (!o || !PyCallable_Check(o)) {
return NULL;
}
pArgs = PyTuple_New(1);
PyTuple_SET_ITEM(pArgs, 0, PyLong_FromLong(t));
return PyObject_CallObject(o, pArgs);
YAP_Term i = YAP_MkIntTerm(t);
return term_to_nametuple(
"H", 1, YAP_InitSlot(YAP_MkApplTerm(
YAP_MkFunctor(YAP_LookupAtom("H"), 1), 1, &i)));
};
case PL_ATOM: {
YAP_Atom at = YAP_AtomOfTerm(yt);
@ -54,8 +45,8 @@ PyObject *term_to_python(term_t t, bool eval) {
else if (strcmp(s, "{}") == 0)
o = PyDict_New();
/* return __main__,s */
else if ((o = PyRun_String(s, Py_single_input,
PyEval_GetGlobals(), PyEval_GetLocals()))) {
else if ((o = PyRun_String(s, Py_single_input, PyEval_GetGlobals(),
PyEval_GetLocals()))) {
Py_IncRef(o);
return o;
} else if (PyObject_HasAttrString(py_Main, s)) {
@ -83,8 +74,7 @@ PyObject *term_to_python(term_t t, bool eval) {
} break;
case PL_STRING: {
char *s = NULL;
if (!PL_get_chars(t, &s,
REP_UTF8 | CVT_ATOM | CVT_STRING | BUF_MALLOC)) {
if (!PL_get_chars(t, &s, REP_UTF8 | CVT_ATOM | CVT_STRING | BUF_MALLOC)) {
return NULL;
}
#if PY_MAJOR_VERSION < 3
@ -97,7 +87,7 @@ PyObject *term_to_python(term_t t, bool eval) {
// fprintf(stderr, "%s\n", s);
free(s);
if (pobj) {
Py_IncRef(pobj);
Py_IncRef(pobj);
}
return pobj;
}
@ -160,7 +150,7 @@ PyObject *deref_term_to_python(term_t t) {
if (YAP_IsVarTerm(yt)) {
char s[32];
char *o = YAP_WriteBuffer(yt, s, 31, 0);
return PyUnicode_FromString(o);
return PyUnicode_FromString(o);
}
return term_to_python(t, false);
return term_to_python(t, false);
}

View File

@ -186,7 +186,25 @@ foreign_t python_to_term(PyObject *pVal, term_t t) {
functor_t f;
const char *s;
if ((s = (Py_TYPE(pVal)->tp_name))) {
f = PL_new_functor(PL_new_atom(s), sz);
if (!strcmp(s, "H")) {
pVal = PyTuple_GetItem(pVal, 0);
if (PyLong_Check(pVal)) {
return PyLong_AsLong(pVal);
#if PY_MAJOR_VERSION < 3
} else if (PyInt_Check(pVal)) {
return PyInt_AsLong(pVal);
#endif
}
}
if (s[0] == '$') {
char *ns = malloc(strlen(s) + 5);
strcpy(ns, "__");
strcat(ns, s + 1);
strcat(ns, "__");
f = PL_new_functor(PL_new_atom(ns), sz);
} else {
f = PL_new_functor(PL_new_atom(s), sz);
}
} else
f = PL_new_functor(ATOM_t, sz);
if (!PL_unify_functor(t, f))

View File

@ -502,197 +502,197 @@ static long get_len_of_range(long lo, long hi, long step) {
}
#if PY_MAJOR_VERSION >= 3
static PyStructSequence_Field pnull[] = {
{"A1", NULL}, {"A2", NULL}, {"A3", NULL}, {"A4", NULL},
{"A5", NULL}, {"A6", NULL}, {"A7", NULL}, {"A8", NULL},
{"A9", NULL}, {"A9", NULL}, {"A10", NULL}, {"A11", NULL},
{"A12", NULL}, {"A13", NULL}, {"A14", NULL}, {"A15", NULL},
{"A16", NULL}, {"A17", NULL}, {"A18", NULL}, {"A19", NULL},
{"A19", NULL}, {"A20", NULL}, {"A21", NULL}, {"A22", NULL},
{"A23", NULL}, {"A24", NULL}, {"A25", NULL}, {"A26", NULL},
{"A27", NULL}, {"A28", NULL}, {"A29", NULL}, {"A29", NULL},
{"A30", NULL}, {"A31", NULL}, {"A32", NULL}, {0}};
static PyStructSequence_Field pnull[] = {
{"A1", NULL}, {"A2", NULL}, {"A3", NULL}, {"A4", NULL},
{"A5", NULL}, {"A6", NULL}, {"A7", NULL}, {"A8", NULL},
{"A9", NULL}, {"A9", NULL}, {"A10", NULL}, {"A11", NULL},
{"A12", NULL}, {"A13", NULL}, {"A14", NULL}, {"A15", NULL},
{"A16", NULL}, {"A17", NULL}, {"A18", NULL}, {"A19", NULL},
{"A19", NULL}, {"A20", NULL}, {"A21", NULL}, {"A22", NULL},
{"A23", NULL}, {"A24", NULL}, {"A25", NULL}, {"A26", NULL},
{"A27", NULL}, {"A28", NULL}, {"A29", NULL}, {"A29", NULL},
{"A30", NULL}, {"A31", NULL}, {"A32", NULL}, {0}};
static PyObject *
structseq_str(PyObject *iobj)
{
static PyObject *structseq_str(PyObject *iobj) {
/* buffer and type size were chosen well considered. */
/* buffer and type size were chosen well considered. */
#define REPR_BUFFER_SIZE 512
#define TYPE_MAXSIZE 100
PyStructSequence *obj = (PyStructSequence *)iobj;
PyTypeObject *typ = Py_TYPE(obj);
bool removelast = false;
Py_ssize_t len, i;
char buf[REPR_BUFFER_SIZE];
char *endofbuf, *pbuf = buf;
/* pointer to end of writeable buffer; safes space for "...)\0" */
endofbuf= &buf[REPR_BUFFER_SIZE-5];
PyStructSequence *obj = (PyStructSequence *)iobj;
PyTypeObject *typ = Py_TYPE(obj);
bool removelast = false;
Py_ssize_t len, i;
char buf[REPR_BUFFER_SIZE];
char *endofbuf, *pbuf = buf;
/* pointer to end of writeable buffer; safes space for "...)\0" */
endofbuf = &buf[REPR_BUFFER_SIZE - 5];
/* "typename(", limited to TYPE_MAXSIZE */
len = strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE :
strlen(typ->tp_name);
strncpy(pbuf, typ->tp_name, len);
pbuf += len;
*pbuf++ = '(';
/* "typename(", limited to TYPE_MAXSIZE */
len =
strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE : strlen(typ->tp_name);
strncpy(pbuf, typ->tp_name, len);
pbuf += len;
*pbuf++ = '(';
for (i=0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) {
PyObject *val, *repr;
char *crepr;
for (i = 0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) {
PyObject *val, *repr;
char *crepr;
val = PyStructSequence_GET_ITEM(obj, i);
repr = PyObject_Str(val);
if (repr == NULL)
return NULL;
crepr = PyUnicode_AsUTF8(repr);
if (crepr == NULL) {
Py_DECREF(repr);
return NULL;
}
/* + 3: keep space for ", " */
len = strlen(crepr) + 2;
if ((pbuf+len) <= endofbuf) {
strcpy(pbuf, crepr);
pbuf += strlen(crepr);
*pbuf++ = ',';
*pbuf++ = ' ';
removelast = 1;
Py_DECREF(repr);
}
else {
strcpy(pbuf, "...");
pbuf += 3;
removelast = 0;
Py_DECREF(repr);
break;
}
val = PyStructSequence_GET_ITEM(obj, i);
repr = PyObject_Str(val);
if (repr == NULL)
return NULL;
crepr = PyUnicode_AsUTF8(repr);
if (crepr == NULL) {
Py_DECREF(repr);
return NULL;
}
if (removelast) {
/* overwrite last ", " */
pbuf-=2;
}
*pbuf++ = ')';
*pbuf = '\0';
return PyUnicode_FromString(buf);
/* + 3: keep space for ", " */
len = strlen(crepr) + 2;
if ((pbuf + len) <= endofbuf) {
strcpy(pbuf, crepr);
pbuf += strlen(crepr);
*pbuf++ = ',';
*pbuf++ = ' ';
removelast = 1;
Py_DECREF(repr);
} else {
strcpy(pbuf, "...");
pbuf += 3;
removelast = 0;
Py_DECREF(repr);
break;
}
}
if (removelast) {
/* overwrite last ", " */
pbuf -= 2;
}
*pbuf++ = ')';
*pbuf = '\0';
return PyUnicode_FromString(buf);
}
static PyObject *structseq_repr(PyObject *iobj) {
static PyObject *
structseq_repr(PyObject *iobj)
{
/* buffer and type size were chosen well considered. */
/* buffer and type size were chosen well considered. */
#define REPR_BUFFER_SIZE 512
#define TYPE_MAXSIZE 100
PyStructSequence *obj = (PyStructSequence *)iobj;
PyTypeObject *typ = Py_TYPE(obj);
bool removelast = false;
Py_ssize_t len, i;
char buf[REPR_BUFFER_SIZE];
char *endofbuf, *pbuf = buf;
/* pointer to end of writeable buffer; safes space for "...)\0" */
endofbuf= &buf[REPR_BUFFER_SIZE-5];
PyStructSequence *obj = (PyStructSequence *)iobj;
PyTypeObject *typ = Py_TYPE(obj);
bool removelast = false;
Py_ssize_t len, i;
char buf[REPR_BUFFER_SIZE];
char *endofbuf, *pbuf = buf;
/* pointer to end of writeable buffer; safes space for "...)\0" */
endofbuf = &buf[REPR_BUFFER_SIZE - 5];
/* "typename(", limited to TYPE_MAXSIZE */
len = strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE :
strlen(typ->tp_name);
strncpy(pbuf, typ->tp_name, len);
pbuf += len;
*pbuf++ = '(';
/* "typename(", limited to TYPE_MAXSIZE */
len =
strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE : strlen(typ->tp_name);
strncpy(pbuf, typ->tp_name, len);
pbuf += len;
*pbuf++ = '(';
for (i=0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) {
PyObject *val, *repr;
char *crepr;
for (i = 0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) {
PyObject *val, *repr;
char *crepr;
val = PyStructSequence_GET_ITEM(obj, i);
repr = PyObject_Repr(val);
if (repr == NULL)
return NULL;
crepr = PyUnicode_AsUTF8(repr);
if (crepr == NULL) {
Py_DECREF(repr);
return NULL;
}
/* + 3: keep space for ", " */
len = strlen(crepr) + 2;
if ((pbuf+len) <= endofbuf) {
strcpy(pbuf, crepr);
pbuf += strlen(crepr);
*pbuf++ = ',';
*pbuf++ = ' ';
removelast = 1;
Py_DECREF(repr);
}
else {
strcpy(pbuf, "...");
pbuf += 3;
removelast = 0;
Py_DECREF(repr);
break;
}
val = PyStructSequence_GET_ITEM(obj, i);
repr = PyObject_Repr(val);
if (repr == NULL)
return NULL;
crepr = PyUnicode_AsUTF8(repr);
if (crepr == NULL) {
Py_DECREF(repr);
return NULL;
}
if (removelast) {
/* overwrite last ", " */
pbuf-=2;
}
*pbuf++ = ')';
*pbuf = '\0';
return PyUnicode_FromString(buf);
/* + 3: keep space for ", " */
len = strlen(crepr) + 2;
if ((pbuf + len) <= endofbuf) {
strcpy(pbuf, crepr);
pbuf += strlen(crepr);
*pbuf++ = ',';
*pbuf++ = ' ';
removelast = 1;
Py_DECREF(repr);
} else {
strcpy(pbuf, "...");
pbuf += 3;
removelast = 0;
Py_DECREF(repr);
break;
}
}
if (removelast) {
/* overwrite last ", " */
pbuf -= 2;
}
*pbuf++ = ')';
*pbuf = '\0';
return PyUnicode_FromString(buf);
}
#endif
static PyObject *
term_to_nametuple( const char *s, int arity, term_t t) {
PyObject *term_to_nametuple(const char *s, int arity, term_t t) {
#if PY_MAJOR_VERSION >= 3
PyTypeObject *typp;
PyObject *o;
PyObject *key = PyUnicode_FromString(s);
if (py_F2P && PyDict_Contains(py_F2P, key)) {
typp = (PyTypeObject*)PyDict_GetItem(py_F2P, key);
} else {
PyObject *o;
PyObject *key = PyUnicode_FromString(s);
if (py_F2P && PyDict_Contains(py_F2P, key)) {
typp = (PyTypeObject *)PyDict_GetItem(py_F2P, key);
} else {
typp = PyMem_Malloc(sizeof(PyTypeObject));
PyStructSequence_Desc *desc = PyMem_Malloc(sizeof(PyStructSequence_Desc));
typp = PyMem_Malloc(sizeof(PyTypeObject));
PyStructSequence_Desc *desc = PyMem_Malloc(sizeof(PyStructSequence_Desc));
desc->name = PyUnicode_AsUTF8(key);
desc->doc = "YAPTerm";
desc->fields = pnull;
desc->n_in_sequence = 32;
if (PyStructSequence_InitType2(typp, desc) < 0)
desc->name = PyUnicode_AsUTF8(key);
desc->doc = "YAPTerm";
desc->fields = pnull;
desc->n_in_sequence = 32;
if (PyStructSequence_InitType2(typp, desc) < 0)
return NULL;
typp->tp_str = structseq_str;
typp->tp_repr = structseq_repr;
// typp = PyStructSequence_NewType(desc);
Py_INCREF(typp);
// typp->tp_flags |= Py_TPFLAGS_HEAPTYPE;
PyModule_AddObject(py_Yapex, s, (PyObject *)typp);
if (py_F2P)
PyDict_SetItem(py_F2P, key, (PyObject *)typp);
}
o = PyStructSequence_New(typp);
term_t tleft = PL_new_term_ref();
int i;
for (i = 0; i < arity; i++) {
PyObject *pArg;
if (!PL_get_arg(i + 1, t, tleft))
return NULL;
pArg = term_to_python(tleft, false);
if (pArg == NULL)
return NULL;
/* pArg reference stolen here: */
PyStructSequence_SET_ITEM(o, i, pArg);
// typp = PyStructSequence_NewType(desc);
Py_INCREF(typp);
// typp->tp_flags |= Py_TPFLAGS_HEAPTYPE;
PyModule_AddObject(py_Yapex, s, (PyObject *)typp);
if (py_F2P)
PyDict_SetItem(py_F2P, key, (PyObject *)typp);
}
((PyStructSequence *)o)->ob_base.ob_size = arity;
o = PyStructSequence_New(typp);
term_t tleft = PL_new_term_ref();
int i;
return o;
}
for (i = 0; i < arity; i++) {
PyObject *pArg;
if (!PL_get_arg(i + 1, t, tleft))
return NULL;
pArg = term_to_python(tleft, false);
if (pArg == NULL)
return NULL;
/* pArg reference stolen here: */
PyStructSequence_SET_ITEM(o, i, pArg);
}
((PyStructSequence *)o)->ob_base.ob_size = arity;
return o;
#else
if (PyObject_HasAttrString(py_Yapex, "T"))
c = PyObject_GetAttrString(py_Yapex, "T");
o1 = PyTuple_New(2);
PyTuple_SET_ITEM(o1, 0, PyUnicode_FromString(s));
PyTuple_SET_ITEM(o1, 1, o);
return o1;
#endif
}
static PyObject *bip_range(term_t t) {
long ilow = 0, ihigh = 0, istep = 1;
@ -814,8 +814,8 @@ static int copy_to_dictionary(PyObject *dict, term_t targ, term_t taux,
}
PyObject *compound_to_pytree(term_t t, functor_t fun) {
PyObject *o;
o = py_Main;
PyObject *o;
o = py_Main;
atom_t name = PL_functor_name(fun);
int arity = PL_functor_arity(fun);
@ -845,7 +845,7 @@ PyObject *compound_to_pytree(term_t t, functor_t fun) {
} else if (fun == FUNCTOR_complex2) {
term_t targ = PL_new_term_ref();
PyObject *lhs, *rhs;
double d1 =0.0, d2=0.0;
double d1 = 0.0, d2 = 0.0;
if (!PL_get_arg(1, t, targ))
return NULL;
@ -853,8 +853,8 @@ PyObject *compound_to_pytree(term_t t, functor_t fun) {
if (!PL_get_arg(2, t, targ))
return NULL;
rhs = term_to_python(targ, false);
if (lhs == NULL || rhs == NULL)
return NULL;
if (lhs == NULL || rhs == NULL)
return NULL;
if (PyFloat_Check(lhs)) {
d1 = PyFloat_AsDouble(lhs);
} else if (PyLong_Check(lhs)) {
@ -935,7 +935,7 @@ PyObject *compound_to_pytree(term_t t, functor_t fun) {
term_t tleft = PL_new_term_ref();
PyObject *o = py_Main;
while (fun == FUNCTOR_dot2) {
if (!PL_get_arg(1, t, tleft))
if (!PL_get_arg(1, t, tleft))
return FALSE;
o = find_obj(o, tleft);
if (!o)
@ -949,20 +949,17 @@ PyObject *compound_to_pytree(term_t t, functor_t fun) {
if (!arity) {
char *s;
if (!PL_get_atom_chars(t, &s) )
if (!PL_get_atom_chars(t, &s))
return NULL;
// this should never happen
return term_to_python( t, false);
// this should never happen
return term_to_python(t, false);
} else {
const char *s;
if (!(s = PL_atom_chars(name)))
return NULL;
#if PY_MAJOR_VERSION >= 3
return term_to_nametuple(s, arity, t);
#else
term_t tleft;
int i;
PyObject *c, *o1;
if (!(s = PL_atom_chars(name)))
return NULL;
term_t tleft;
int i;
PyObject *o1;
o = PyTuple_New(arity);
tleft = PL_new_term_ref();
for (i = 0; i < arity; i++) {
@ -975,13 +972,7 @@ PyObject *compound_to_pytree(term_t t, functor_t fun) {
/* pArg reference stolen here: */
PyTuple_SET_ITEM(o, i, pArg);
}
if (PyObject_HasAttrString(py_Yapex, "T"))
c = PyObject_GetAttrString(py_Yapex, "T");
o1 = PyTuple_New(2);
PyTuple_SET_ITEM(o1, 0, PyUnicode_FromString(s));
PyTuple_SET_ITEM(o1, 1, o);
return o1;
#endif
return term_to_nametuple(s, arity, t);
}
}

View File

@ -4,7 +4,7 @@
int assign_python(PyObject *root, term_t t, PyObject *e);
atom_t ATOM_true, ATOM_false, ATOM_colon, ATOM_dot, ATOM_none, ATOM_t,
ATOM_comma, ATOM_builtin, ATOM_A, ATOM_V, ATOM_self;
ATOM_comma, ATOM_builtin, ATOM_A, ATOM_V, ATOM_self;
functor_t FUNCTOR_dollar1, FUNCTOR_abs1, FUNCTOR_all1, FUNCTOR_any1,
FUNCTOR_bin1, FUNCTOR_brackets1, FUNCTOR_comma2, FUNCTOR_dir1,
@ -12,8 +12,7 @@ functor_t FUNCTOR_dollar1, FUNCTOR_abs1, FUNCTOR_all1, FUNCTOR_any1,
FUNCTOR_len1, FUNCTOR_curly1, FUNCTOR_ord1, FUNCTOR_range1, FUNCTOR_range2,
FUNCTOR_range3, FUNCTOR_sum1, FUNCTOR_pointer1, FUNCTOR_complex2,
FUNCTOR_plus2, FUNCTOR_sub2, FUNCTOR_mul2, FUNCTOR_div2, FUNCTOR_hat2,
FUNCTOR_colon2, FUNCTOR_comma2, FUNCTOR_equal2, FUNCTOR_sqbrackets2,
FUNCTOR_dot2;
FUNCTOR_colon2, FUNCTOR_equal2, FUNCTOR_sqbrackets2, FUNCTOR_dot2;
PyObject *py_Main;
PyObject *py_Builtin;
@ -103,7 +102,7 @@ X_API bool init_python(void) {
Py_SetProgramName(argv[0]);
#else
wchar_t *buf = Py_DecodeLocale(argv[0], NULL);
Py_SetProgramName(buf);
Py_SetProgramName(buf);
#endif
}
Py_Initialize();
@ -112,6 +111,6 @@ X_API bool init_python(void) {
PL_reset_term_refs(t);
install_pypreds();
install_pl2pl();
//PyGILState_Release(gstate);
// PyGILState_Release(gstate);
return !python_in_python;
}

View File

@ -93,6 +93,8 @@ static inline PyObject *atom_to_python_string(term_t t) {
}
}
extern PyObject *term_to_nametuple(const char *s, int arity, term_t t);
extern PyObject *compound_to_pyeval(term_t t, functor_t fun);
extern PyObject *compound_to_pytree(term_t t, functor_t fun);

View File

@ -1,24 +1,7 @@
import yap
import sys
# this class is not being used
# we rely on namedtuples instead.
class T(tuple):
"""Represents a non-interned Prolog atom"""
def __new__(self, s, tple):
self.tuple.__new__(self, tple)
self.name = s
def __repr__(self):
return "yapex.T(" + self.name + " , " + tuple.__repr__(self) + ")"
def __str__(self):
return str(self.name) + str(self.tuple)
import collections
def query_prolog(engine, s):
@ -29,38 +12,58 @@ def query_prolog(engine, s):
print(e.args[1])
return False
#construct a query from a one-line string
# q is opaque to Python
q = engine.query(s)
# vs is the list of variables
# you can print it out, the left-side is the variable name,
# the right side wraps a handle to a variable
vs= q.namedVars()
# atom match either symbols, or if no symbol exists, sttrings, In this case
# variable names should match strings
for eq in vs:
if not isinstance(eq[0],str):
print( "Error: Variable Name matches a Python Symbol")
return
ask = True
# launch the query
while answer(q):
vs = q.namedVarsCopy()
if vs:
i = 0
for eq in vs:
name = eq[0]
bind = eq[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())
# this new vs should contain bindings to vars
vs= q.namedVars()
#numbervars
i=0
# iteratw
for eq in vs:
name = eq[0]
# this is tricky, we're going to bind the variables in the term so thay we can
# output X=Y. The Python way is to use dictionares.
#Instead, we use the T function to tranform the Python term back to Prolog
binding = yap.T(eq[1])
if binding.isVar():
binding.unify(name)
else:
i = binding.numberVars(i, True)
print(name + " = " + binding.text())
#ok, that was Prolog code
print("yes")
# deterministic = one solution
if q.deterministic():
# done
q.close()
return
if ask:
s = input("more(;/y), all(!/a), no ?").lstrip()
s = input("more(;), all(*), no(\\n), python(#) ?").lstrip()
if s.startswith(';') or s.startswith('y'):
continue
elif s.startswith('#'):
exec(s.lstrip('#'))
elif s.startswith('a'):
elif s.startswith('*') or s.startswith('a'):
ask = False
continue
else:
break
print("No (more) answers")
q.close()
print("No (more) answers")
q.close()
return

View File

@ -1,4 +1,9 @@
#CHECK: SWIG
option (WITH_SWiG
"Allow Python->YAP and Java->YAP" ON)
IF (WITH_SWiG)
find_host_package (SWIG)
macro_log_feature (SWIG_FOUND "Swig"
"Use SWIG Documentation System "
@ -20,7 +25,10 @@ if (ANDROID)
add_subdirectory(android)
else(ANDROID)
add_subdirectory(python)
add_subdirectory(java)
# add_subdirectory(java)
endif(ANDROID)
endif (SWIG_FOUND)
ENDIF (WITH_SWiG)

View File

@ -1,95 +0,0 @@
macro_optional_find_package(Java ON)
find_package(Java COMPONENTS Runtime Development)
#find_ mmmk]\']package(Java COMPONENTS Runtime)
macro_log_feature (Java_Development_FOUND "Java"
"Use Java System"
"http://www.java.org" FALSE)
macro_optional_find_package(JNI ON)
macro_log_feature (JNI_FOUND "JNI"
"Use Java Native Interface"
"http://www.java.org" FALSE)
if (Java_Development_FOUND)
include ( UseJava )
include ( UseSWIG )
# SET(CMAKE_SWIG_FLAGS -package YAP)
set (CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR} )
SET(SWIG_SOURCES
../yap.i
)
#set (CMAKE_JAVA_CLASS_OUTPUT_PATH java)
SET_SOURCE_FILES_PROPERTIES(${SWIG_SOURCES} PROPERTIES CPLUSPLUS ON)
include_directories (
${CMAKE_SOURCE_DIR}/CXX
${JAVA_INCLUDE_DIRS}
${JNI_INCLUDE_DIRS}
)
if ( ${C_COMPILER} MATCHES "Clang")
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-prototypes")
endif()
if ( ${C_COMPILER} MATCHES "GNU")
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-declarations")
endif()
#SET(CMAKE_SWIG_FLAGS "${CMAKE_SWIG_FLAGS} ")
SWIG_ADD_MODULE(Native java ${SWIG_SOURCES}
)
add_dependencies(Native Yap++ )
SWIG_LINK_LIBRARIES (Native Yap++ )
set(CMAKE_JNI_TARGET 1)
ADD_JAR( NativeJar
SOURCES "../../../misc/icons/yap_16x16x32.png"
DEPENDS Native
PROPERTIES OUTPUT_NAME Native
)
install_jar(NativeJar ${libpl})
add_dependencies(NativeJar Native )
#install_jni_symlink(NativeJar .)
ADD_CUSTOM_COMMAND(TARGET NativeJar
POST_BUILD
COMMAND cmake -E echo "Compiling Java files..."
COMMAND ${Java_JAVAC_EXECUTABLE} *.java -cp .
COMMAND cmake -E echo "Creating jar file..."
COMMAND ${Java_JAR_EXECUTABLE} -ufM Native.jar *.class
)
ADD_JAR( JavaYAP
SOURCES "JavaYAP.java"
ENTRY_POINT JavaYAP
INCLUDE_JARS NativeJar )
SET(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.8" "-target" "1.8")
install( TARGETS Native
RUNTIME DESTINATION ${bindir}
ARCHIVE DESTINATION ${libdir}
LIBRARY DESTINATION ${libdir}
)
install_jar(JavaYAP ${libpl})
#install_jni_symlink(JavaYAP ${libpl})
Endif (Java_Development_FOUND)

View File

@ -43,7 +43,7 @@ if (JNI_FOUND)
set(CMAKE_JNI_TARGET 1)
ADD_JAR( NativeJar
SOURCES "../../../docs/icons/yap_16x16x32.png"
SOURCES "${CMAKE_SOURCES_DIR}/docs/icons/yap_16x16x32.png"
DEPENDS Native
PROPERTIES OUTPUT_NAME Native
)

View File

@ -1,7 +1,7 @@
//package pt.up.fc.dcc.yap;
//package pt.up.yap;
//
import java.io.* ;
//import YAP.* ;
import pt.up.yap.* ;
class JavaYAP {
YAPQuery q;
@ -34,10 +34,10 @@ class JavaYAP {
q.close();
return false;
}
YAPListTerm vs = q.namedVars();
YAPTerm vs = YAPTerm( q.namedVars() );
System.out.println("Another one "+vs);
while(!vs.nil()){
YAPTerm eq = vs.car();
eq = YAPTerm( vs.car() );
//outputText.append(Integer.toString(i) + ": " + eq.text() );
System.out.println(":\t" + eq.getArg(1).text() + " = " + eq.getArg(2).text() +"\n" );
vs = vs.cdr();
@ -89,7 +89,7 @@ class JavaYAP {
}
}
public static void main(String args[])
{
System.loadLibrary("Native");

View File

@ -3,11 +3,20 @@
INCLUDE(${SWIG_USE_FILE})
GET_PROPERTY(OBJECTS TARGET core PROPERTY SOURCES)
GET_PROPERTY(OBJECTS TARGET libYAPOs PROPERTY SOURCES)
GET_PROPERTY(OBJECTS TARGET libOPTYap PROPERTY SOURCES)
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET myddas PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET Yapsqlite3 PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET libswi PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET myddas PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET utf8proc PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET Yap++ PROPERTY SOURCES))
if (PYTHONLIBS_FOUND)
include(FindPythonModule)
include(FindPythonModule)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/CXX)
@ -16,45 +25,46 @@ if (PYTHONLIBS_FOUND)
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTIES SWIG_FLAGS "-includeall")
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTY SWIG_MODULE_NAME libPy2YAP )
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTIES SWIG_FLAGS "-py3")
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTY SWIG_MODULE_NAME yap )
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTY OUTPUT_NAME yap )
configure_file ("setup.py.cmake" "setup.py" )
configure_file ("../yap.i" "yap.i" )
#configure_file ("setup.py.cmake" "setup.py" )
#configure_file ("../yap.i" "yap.i" )
#SET( CMAKE_SWIG_OUTDIR "yap" )
SET( CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/yap" )
# SWIG_ADD_MODULE(Py2YAP python ../yap.i )
# SWIG_LINK_LIBRARIES(Py2YAP ${PYTHON_LIBRARIES} Yap++ libYap YAPPython)
# set_target_properties ( ${SWIG_MODULE_Py2YAP_REAL_NAME} PROPERTIES
# NO_SONAME ON )
SWIG_ADD_MODULE(Py2YAP python ../yap.i )
SWIG_LINK_LIBRARIES(Py2YAP ${PYTHON_LIBRARIES} Yap++ YAPPython libYap)
set_target_properties ( ${SWIG_MODULE_Py2YAP_REAL_NAME} PROPERTIES
NO_SONAME ON OUTPUT_NAME _yap LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/yap" )
# execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print( sysconfig.get_python_lib( plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}' ) )"
# OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH
# OUTPUT_STRIP_TRAILING_WHITESPACE )
# get_filename_component ( _ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE )
# file ( RELATIVE_PATH _REL_PYTHON_MOULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH} )
execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'platlib' ) )"
OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE )
get_filename_component ( ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE )
file ( RELATIVE_PATH _REL_PYTHON_MOULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH} )
# set ( PYTHON_MODULE_PATH
# ${_REL_PYTHON_MODULE_PATH}
# )
set ( PYTHON_MODULE_PATH
${_ABS_PYTHON_MODULE_PATH}
)
set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
# set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
add_custom_target ( py2yap ALL
COMMAND ${PYTHON_EXECUTABLE} setup.py bdist
DEPENDS ../yap.i YAPPython )
# add_custom_target ( py2yap ALL
# COMMAND ${PYTHON_EXECUTABLE} setup.py bdist
# DEPENDS ../yap.i YAPPython )
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} install
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
# INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/_yap.so DESTINATION ${PYTHON_MODULE_PATH} )
# INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/yap.py DESTINATION ${PYTHON_MODULE_PATH} )
# INSTALL ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/yap/yapex.py DESTINATION ${PYTHON_MODULE_PATH} )
# install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} install
# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/_yap.so DESTINATION ${PYTHON_MODULE_PATH} )
INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/yap.py DESTINATION ${PYTHON_MODULE_PATH} )
if ( DOCUMENTATION AND DOXYGEN_FOUND )
@ -81,7 +91,7 @@ if (PYTHONLIBS_FOUND)
endif ()
install(TARGETS ${SWIG_MODULE_Py2YAP_REAL_NAME}
install(TARGETS ${SWIG_MODULE_Py2YAP_REAL_NAME}
LIBRARY DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

View File

@ -7,19 +7,22 @@ if platform.system() == 'Darwin':
my_extra_link_args = ['-Wl,-rpath','-Wl,${dlls}']
else:
my_extra_link_args = []
python_sources = ['yap.i'] # ,'../../CXX/yapi.cpp'] + ${PYTHON_SOURCES}
set objects = split('${OBJECTS}',';')
setup(
name = "yap",
version = "0.1",
ext_modules=[Extension('_yap', ['yap.i'],
ext_modules=[Extension('_yap', python_sources,
define_macros = [('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0'),
('_YAP_NOT_INSTALLED_', '1'),
('YAP_PYTHON', '1')],
runtime_library_dirs=['${dlls}'],
swig_opts=['-modern','-outcurrentdir', '-c++', '-py3','-I${CMAKE_SOURCE_DIR}/CXX'],
library_dirs=['../../..','../../../CXX',
'../../python',
library_dirs=['../../.o.',
'.'],
extra_link_args=my_extra_link_args,
libraries=['Yap++','Yap','YAPPython'],

View File

@ -1,67 +1,52 @@
/* example.i */
%module(directors = "1") yap
// Language independent exception handler
%include exception.i
%include stdint.i
%ignore *::operator[];
class YAPPredicate;
class YAPEngine;
%{
/* Put header files here or function declarations like below */
#define arity_t uintptr_t
#define YAP_CPP_INTERFACE 1
#include "yapi.hh"
extern "C" {
#if THREADS
#define Yap_regp regcache
#endif
// we cannot consult YapInterface.h, that conflicts with what we
// declare, though
// it shouldn't
}
%}
#ifdef SWIGPYTHON
%typemap(typecheck) Term* {
$1 = PySequence_Check($input);
}
//include python/python.i
// Map a Python sequence into any sized C double array
%typemap(in) Term* {
int i;
if (!PySequence_Check($input)) {
PyErr_SetString(PyExc_TypeError,"Expecting a sequence");
$1 = nullptr;
} else {
int sz = PyObject_Length($input);
std::vector<Term> v(sz);
for (i =0; i < sz; i++) {
PyObject *o = PySequence_GetItem($input,i);
v[i] = Term(pythonToYAP(o));
Py_DECREF(o);
}
$1 = &v[0];
}
}
%typemap(typecheck) YPTerm {
$1 = true;
}
%inline %{
YAPTerm T(PyObject *input ) { return *new YAPTerm( pythonToYAP(input) ); }
%}
%typemap(in) YAPTerm { $1 = *new YAPTerm( pythonToYAP($input) ); }
%typemap(in) Term { $1 = pythonToYAP($input); }
%typemap(out) YAPTerm { return $result = yap_to_python($1.term(), false);}
%typemap(out) Term { return $result = yap_to_python($1, false);}
%extend(out) Term{Term & __getitem__(size_t i){Term t0 = $self;
if (IsApplTerm(t0)) {
Functor f = FunctorOfTerm(t0);
if (!IsExtensionFunctor(f))
return (ArgOfTerm(i + 1, t0);
} else if (IsPairTerm(t0)) {
if (i == 0)
return HeadOfTerm(t0);
else if (i == 1)
return TailOfTerm(t0);
}
}
}
// Language independent exception handler
@ -291,26 +276,6 @@ LOCAL_Error_TYPE = YAP_NO_ERROR;
#endif
%{
/* Put header files here or function declarations like below */
#define YAP_CPP_INTERFACE 1
#include "yapi.hh"
extern "C" {
#if THREADS
#define Yap_regp regcache
#endif
// we cannot consult YapInterface.h, that conflicts with what we
// declare, though
// it shouldn't
}
%}
/* turn on director wrapping Callback */
%feature("director") YAPCallback;