trying to improve Python interface
This commit is contained in:
@@ -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})
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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))
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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)
|
@@ -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
|
||||
)
|
||||
|
@@ -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");
|
||||
|
@@ -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}
|
||||
)
|
||||
|
@@ -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'],
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user