trying to improve Python interface
This commit is contained in:
parent
474fa2fe14
commit
70b11ab8f9
1684
CXX/_yap/__init__.c
1684
CXX/_yap/__init__.c
File diff suppressed because it is too large
Load Diff
5233
CXX/_yap/dtypes.c
5233
CXX/_yap/dtypes.c
File diff suppressed because it is too large
Load Diff
@ -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 +
|
|
||||||
|
|
@ -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
@ -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
|
|
||||||
|
|
||||||
|
|
@ -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
@ -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
@ -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
@ -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
|
|
||||||
|
|
@ -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()
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
12
CXX/yapdb.hh
12
CXX/yapdb.hh
@ -137,8 +137,10 @@ protected:
|
|||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
Term *modp = NULL;
|
Term *modp = NULL;
|
||||||
|
names = MkVarTerm ();
|
||||||
out = Yap_StringToTerm(s0, strlen(s0) + 1, &LOCAL_encoding, 1200, names);
|
const unsigned char *us = (const unsigned char *)s0;
|
||||||
|
out =
|
||||||
|
Yap_BufferToTermWithPrioBindings(us, strlen(s0), TermNil, 1200, names);
|
||||||
// extern char *s0;
|
// extern char *s0;
|
||||||
// fprintf(stderr,"ap=%p arity=%d text=%s", ap, ap->ArityOfPE, s);
|
// fprintf(stderr,"ap=%p arity=%d text=%s", ap, ap->ArityOfPE, s);
|
||||||
// Yap_DebugPlWrite(out);
|
// Yap_DebugPlWrite(out);
|
||||||
@ -217,13 +219,15 @@ public:
|
|||||||
/// char */module constructor for predicates.
|
/// char */module constructor for predicates.
|
||||||
///
|
///
|
||||||
inline YAPPredicate(const char *at, uintptr_t arity) {
|
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.
|
/// char */module constructor for predicates.
|
||||||
///
|
///
|
||||||
inline YAPPredicate(const char *at, uintptr_t arity, YAPTerm mod) {
|
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.
|
/// char */module constructor for predicates.
|
||||||
|
169
CXX/yapi.cpp
169
CXX/yapi.cpp
@ -162,6 +162,8 @@ YAPApplTerm::YAPApplTerm(YAPFunctor f, YAPTerm ts[]) : YAPTerm() {
|
|||||||
RECOVER_H();
|
RECOVER_H();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
YAPApplTerm::YAPApplTerm(const char *f, std::vector<YAPTerm> ts) : YAPTerm() {
|
YAPApplTerm::YAPApplTerm(const char *f, std::vector<YAPTerm> ts) : YAPTerm() {
|
||||||
BACKUP_H();
|
BACKUP_H();
|
||||||
arity_t arity = ts.size();
|
arity_t arity = ts.size();
|
||||||
@ -179,29 +181,32 @@ YAPApplTerm::YAPApplTerm(YAPFunctor f) : YAPTerm() {
|
|||||||
mk(Yap_MkNewApplTerm(f.f, arity));
|
mk(Yap_MkNewApplTerm(f.f, arity));
|
||||||
RECOVER_H();
|
RECOVER_H();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
YAPFunctor YAPApplTerm::getFunctor() { return YAPFunctor(FunctorOfTerm(gt())); }
|
YAPFunctor YAPApplTerm::getFunctor() { return YAPFunctor(FunctorOfTerm(gt())); }
|
||||||
|
|
||||||
YAPTerm &YAPTerm::operator[](arity_t i) {
|
Term &YAPTerm::operator[](arity_t i) {
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
Term t0 = gt();
|
Term t0 = gt();
|
||||||
Term tf = 0;
|
Term tf = 0;
|
||||||
if (IsApplTerm(t0)) {
|
if (IsApplTerm(t0)) {
|
||||||
Functor f = FunctorOfTerm(t0);
|
// Functor f = FunctorOfTerm(t0);
|
||||||
if (IsExtensionFunctor(f))
|
// if (IsExtensionFunctor(f))
|
||||||
return *new YAPTerm();
|
// return 0;
|
||||||
tf = ArgOfTerm(i + 1, t0);
|
RECOVER_MACHINE_REGS();
|
||||||
|
return RepAppl(t0)[(i + 1)];
|
||||||
} else if (IsPairTerm(t0)) {
|
} else if (IsPairTerm(t0)) {
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
tf = HeadOfTerm(t0);
|
tf = HeadOfTerm(t0);
|
||||||
else if (i == 1)
|
else if (i == 1)
|
||||||
tf = TailOfTerm(t0);
|
tf = TailOfTerm(t0);
|
||||||
}
|
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
return *new YAPTerm(tf);
|
return RepPair(tf)[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
YAPTerm &YAPListTerm::operator[](arity_t i) {
|
Term &YAPListTerm::operator[](arity_t i) {
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
Term t0 = gt();
|
Term t0 = gt();
|
||||||
Term tf = 0;
|
Term tf = 0;
|
||||||
@ -215,7 +220,7 @@ YAPTerm &YAPListTerm::operator[](arity_t i) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
return *new YAPTerm(tf);
|
return RepPair(tf)[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
YAPPairTerm::YAPPairTerm(YAPTerm th, YAPTerm tl) : YAPTerm() {
|
YAPPairTerm::YAPPairTerm(YAPTerm th, YAPTerm tl) : YAPTerm() {
|
||||||
@ -231,11 +236,6 @@ YAPPairTerm::YAPPairTerm() : YAPTerm() {
|
|||||||
RECOVER_H();
|
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() {
|
YAP_tag_t YAPTerm::tag() {
|
||||||
Term tt = gt();
|
Term tt = gt();
|
||||||
if (IsVarTerm(tt)) {
|
if (IsVarTerm(tt)) {
|
||||||
@ -280,24 +280,24 @@ YAP_tag_t YAPTerm::tag() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
YAPTerm YAPTerm::deepCopy() {
|
Term YAPTerm::deepCopy() {
|
||||||
yhandle_t tn;
|
yhandle_t tn;
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
|
|
||||||
tn = Yap_CopyTerm(gt());
|
tn = Yap_CopyTerm(gt());
|
||||||
|
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
return *new YAPTerm(tn);
|
return (tn);
|
||||||
}
|
}
|
||||||
|
|
||||||
YAPListTerm YAPListTerm::dup() {
|
Term YAPListTerm::dup() {
|
||||||
yhandle_t tn;
|
yhandle_t tn;
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
|
|
||||||
tn = Yap_CopyTerm(gt());
|
tn = Yap_CopyTerm(gt());
|
||||||
|
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
return *new YAPListTerm(tn);
|
return tn;
|
||||||
}
|
}
|
||||||
|
|
||||||
intptr_t YAPTerm::numberVars(intptr_t i0, bool skip_singletons) {
|
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;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool YAPTerm::exactlyEqual(YAPTerm t1) {
|
const char *YAPQuery::text() { return YAPTerm(goal).text(); }
|
||||||
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(); }
|
|
||||||
|
|
||||||
YAPIntegerTerm::YAPIntegerTerm(intptr_t i) {
|
YAPIntegerTerm::YAPIntegerTerm(intptr_t i) {
|
||||||
CACHE_REGS Term tn = MkIntegerTerm(i);
|
CACHE_REGS Term tn = MkIntegerTerm(i);
|
||||||
@ -402,17 +332,16 @@ YAPTerm::YAPTerm(void *ptr) {
|
|||||||
mk(MkIntegerTerm((Int)ptr));
|
mk(MkIntegerTerm((Int)ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
YAPTerm YAPListTerm::car() {
|
Term YAPListTerm::car() {
|
||||||
Term to = gt();
|
Term to = gt();
|
||||||
if (IsPairTerm(to))
|
if (IsPairTerm(to))
|
||||||
return YAPTerm(HeadOfTerm(to));
|
return (HeadOfTerm(to));
|
||||||
else {
|
else {
|
||||||
Yap_Error(TYPE_ERROR_LIST, to, "");
|
Yap_Error(TYPE_ERROR_LIST, to, "");
|
||||||
throw YAPError();
|
throw YAPError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
YAPListTerm::YAPListTerm(YAPTerm ts[], arity_t n) {
|
YAPListTerm::YAPListTerm(YAPTerm ts[], arity_t n) {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
BACKUP_H();
|
BACKUP_H();
|
||||||
@ -437,19 +366,14 @@ YAPVarTerm::YAPVarTerm() {
|
|||||||
mk(MkVarTerm());
|
mk(MkVarTerm());
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *YAPAtom::getName(void) {
|
const char *YAPAtom::getName(void) { return Yap_AtomToUTF8Text(a, nullptr); }
|
||||||
return Yap_AtomToUTF8Text( a, nullptr );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void YAPQuery::openQuery() {
|
void YAPQuery::openQuery() {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
arity_t arity = ap->ArityOfPE;
|
arity_t arity = ap->ArityOfPE;
|
||||||
if (arity) {
|
if (arity) {
|
||||||
Term *ts;
|
Term *ts;
|
||||||
Term t = goal.term();
|
Term t = goal;
|
||||||
if (IsPairTerm(t)) {
|
if (IsPairTerm(t)) {
|
||||||
ts = RepPair(t);
|
ts = RepPair(t);
|
||||||
} else {
|
} else {
|
||||||
@ -471,7 +395,6 @@ const char *YAPAtom::getName(void) {
|
|||||||
q_handles = Yap_StartSlots();
|
q_handles = Yap_StartSlots();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) {
|
bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
@ -501,10 +424,7 @@ bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool YAPEngine::goalt(YAPTerm Yt) {
|
bool YAPEngine::goalt(YAPTerm Yt) { return Yt.term(); }
|
||||||
return Yt.term();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool YAPEngine::goal(Term t) {
|
bool YAPEngine::goal(Term t) {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
@ -538,7 +458,6 @@ bool YAPEngine::goal(Term t) {
|
|||||||
// don't forget, on success these guys may create slots
|
// don't forget, on success these guys may create slots
|
||||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec ");
|
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec ");
|
||||||
|
|
||||||
|
|
||||||
result = (bool)YAP_EnterGoal(ap, nullptr, &q);
|
result = (bool)YAP_EnterGoal(ap, nullptr, &q);
|
||||||
if ((terr = Yap_GetException())) {
|
if ((terr = Yap_GetException())) {
|
||||||
YAP_LeaveGoal(false, &q);
|
YAP_LeaveGoal(false, &q);
|
||||||
@ -572,7 +491,6 @@ Term YAPEngine::fun(Term t) {
|
|||||||
jmp_buf q_env;
|
jmp_buf q_env;
|
||||||
Atom name;
|
Atom name;
|
||||||
|
|
||||||
|
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
if (IsApplTerm(t)) {
|
if (IsApplTerm(t)) {
|
||||||
ts = RepAppl(t) + 1;
|
ts = RepAppl(t) + 1;
|
||||||
@ -641,41 +559,43 @@ YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[])
|
|||||||
: YAPPredicate(f, mod) {
|
: YAPPredicate(f, mod) {
|
||||||
/* ignore flags for now */
|
/* ignore flags for now */
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
goal = YAPApplTerm(f, ts);
|
goal = YAPApplTerm(f, ts).gt();
|
||||||
vnames = YAPListTerm();
|
names = TermNil;
|
||||||
openQuery();
|
openQuery();
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
YAPQuery::YAPQuery(YAPFunctor f, YAPTerm ts[]) : YAPPredicate(f) {
|
YAPQuery::YAPQuery(YAPFunctor f, YAPTerm ts[]) : YAPPredicate(f) {
|
||||||
/* ignore flags for now */
|
/* ignore flags for now */
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
goal = YAPApplTerm(f, ts);
|
goal = YAPApplTerm(f, ts).gt();
|
||||||
vnames = YAPListTerm();
|
names = TermNil;
|
||||||
openQuery();
|
openQuery();
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
YAPQuery::YAPQuery(YAPPredicate p, YAPTerm ts[]) : YAPPredicate(p.ap) {
|
YAPQuery::YAPQuery(YAPPredicate p, YAPTerm ts[]) : YAPPredicate(p.ap) {
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
goal = YAPApplTerm(YAPFunctor(ap->FunctorOfPred), ts);
|
goal = YAPApplTerm(YAPFunctor(p.ap->FunctorOfPred), ts).term();
|
||||||
vnames = YAPListTerm();
|
names = TermNil;
|
||||||
openQuery();
|
openQuery();
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
}
|
}
|
||||||
|
|
||||||
YAPListTerm YAPQuery::namedVars() {
|
Term YAPQuery::namedVars() {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %s %ld",
|
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %s %ld",
|
||||||
vnames.text(), LOCAL_CurSlot);
|
names.text(), LOCAL_CurSlot);
|
||||||
return vnames; // should be o
|
return (names); // should be o
|
||||||
}
|
}
|
||||||
|
|
||||||
YAPListTerm YAPQuery::namedVarsCopy() {
|
Term YAPQuery::namedVarsCopy() {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %s %ld",
|
__android_log_print(NDROID_LOG_INFO, "YAPDroid", "vnames %s %ld",
|
||||||
vnames.text(), LOCAL_CurSlot);
|
names.text(), LOCAL_CurSlot);
|
||||||
return YAPListTerm(YAP_CopyTerm(vnames.term())); // should be o
|
return (YAP_CopyTerm(names)); // should be o
|
||||||
}
|
}
|
||||||
|
|
||||||
bool YAPQuery::next() {
|
bool YAPQuery::next() {
|
||||||
@ -847,8 +767,7 @@ void YAPEngine::doInit(YAP_file_type_t BootMode) {
|
|||||||
YAPEngine::YAPEngine(char *savedState, char *bootFile, size_t stackSize,
|
YAPEngine::YAPEngine(char *savedState, char *bootFile, size_t stackSize,
|
||||||
size_t trailSize, size_t maxStackSize, size_t maxTrailSize,
|
size_t trailSize, size_t maxStackSize, size_t maxTrailSize,
|
||||||
char *libDir, char *goal, char *topLevel, bool script,
|
char *libDir, char *goal, char *topLevel, bool script,
|
||||||
bool fastBoot,
|
bool fastBoot, bool embedded,
|
||||||
bool embedded,
|
|
||||||
YAPCallback *cb)
|
YAPCallback *cb)
|
||||||
: _callback(0) { // a single engine can be active
|
: _callback(0) { // a single engine can be active
|
||||||
|
|
||||||
@ -1046,12 +965,12 @@ const char *YAPError::text() {
|
|||||||
return s.c_str();
|
return s.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
void YAPEngine::reSet()
|
void YAPEngine::reSet() {
|
||||||
{
|
|
||||||
/* ignore flags for now */
|
/* ignore flags for now */
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
Yap_RebootHandles(worker_id);
|
Yap_RebootHandles(worker_id);
|
||||||
while (B->cp_b) B= B->cp_b;
|
while (B->cp_b)
|
||||||
|
B = B->cp_b;
|
||||||
P = FAILCODE;
|
P = FAILCODE;
|
||||||
Yap_exec_absmi(true, YAP_EXEC_ABSMI);
|
Yap_exec_absmi(true, YAP_EXEC_ABSMI);
|
||||||
/* recover stack space */
|
/* recover stack space */
|
||||||
@ -1064,5 +983,3 @@ void YAPEngine::reSet()
|
|||||||
|
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
19
CXX/yapq.hh
19
CXX/yapq.hh
@ -22,10 +22,9 @@ class YAPQuery : public YAPPredicate {
|
|||||||
int q_flags;
|
int q_flags;
|
||||||
YAP_dogoalinfo q_h;
|
YAP_dogoalinfo q_h;
|
||||||
YAPQuery *oq;
|
YAPQuery *oq;
|
||||||
YAPListTerm vnames;
|
Term names;
|
||||||
YAPTerm goal;
|
Term goal;
|
||||||
// temporaries
|
// temporaries
|
||||||
Term tgoal, names;
|
|
||||||
|
|
||||||
void openQuery();
|
void openQuery();
|
||||||
|
|
||||||
@ -46,20 +45,18 @@ public:
|
|||||||
///
|
///
|
||||||
/// It is given a functor, and an array of terms that must have at least
|
/// 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.
|
/// 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
|
/// string constructor without varnames
|
||||||
///
|
///
|
||||||
/// It is given a string, calls the parser and obtains a Prolog term that
|
/// It is given a string, calls the parser and obtains a Prolog term that
|
||||||
/// should be a callable
|
/// should be a callable
|
||||||
/// goal.
|
/// goal.
|
||||||
inline YAPQuery(const char *s) : YAPPredicate(s, tgoal, names) {
|
inline YAPQuery(const char *s) : YAPPredicate(s, goal, names) {
|
||||||
BACKUP_H();
|
BACKUP_H();
|
||||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %ld",
|
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %ld",
|
||||||
LOCAL_CurSlot);
|
LOCAL_CurSlot);
|
||||||
if (!ap)
|
if (!ap)
|
||||||
return;
|
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();
|
openQuery();
|
||||||
RECOVER_H();
|
RECOVER_H();
|
||||||
@ -69,8 +66,8 @@ public:
|
|||||||
/// It is given an atom, and a Prolog term that should be a callable
|
/// It is given an atom, and a Prolog term that should be a callable
|
||||||
/// goal, say `main`, `init`, `live`.
|
/// goal, say `main`, `init`, `live`.
|
||||||
inline YAPQuery(YAPAtom g) : YAPPredicate(g) {
|
inline YAPQuery(YAPAtom g) : YAPPredicate(g) {
|
||||||
goal = YAPAtomTerm(g);
|
goal = YAPAtomTerm(g).gt();
|
||||||
vnames = YAPListTerm();
|
names = TermNil;
|
||||||
openQuery();
|
openQuery();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -96,9 +93,9 @@ public:
|
|||||||
/// finish the current query: undo all bindings.
|
/// finish the current query: undo all bindings.
|
||||||
void close();
|
void close();
|
||||||
/// query variables.
|
/// query variables.
|
||||||
YAPListTerm namedVars();
|
Term namedVars();
|
||||||
/// query variables, but copied out
|
/// query variables, but copied out
|
||||||
YAPListTerm namedVarsCopy();
|
Term namedVarsCopy();
|
||||||
/// convert a ref to a binding.
|
/// convert a ref to a binding.
|
||||||
YAPTerm getTerm(yhandle_t t);
|
YAPTerm getTerm(yhandle_t t);
|
||||||
/// simple YAP Query;
|
/// simple YAP Query;
|
||||||
|
169
CXX/yapt.hh
169
CXX/yapt.hh
@ -2,9 +2,23 @@
|
|||||||
#ifndef YAPT_HH
|
#ifndef YAPT_HH
|
||||||
#define YAPT_HH 1
|
#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;
|
class YAPError;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Generic Prolog Term
|
* @brief Generic Prolog Term
|
||||||
*/
|
*/
|
||||||
@ -19,19 +33,40 @@ class YAPTerm {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
yhandle_t t; /// handle to term, equivalent to term_t
|
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
|
|
||||||
public:
|
public:
|
||||||
virtual ~YAPTerm(){ LOCAL_HandleBase[t] = TermFreeTerm;
|
virtual ~YAPTerm() {
|
||||||
while ( LOCAL_HandleBase[LOCAL_CurSlot-1] == TermFreeTerm)
|
// 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--;
|
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
|
||||||
}
|
}
|
||||||
YAPTerm(Term tn) {
|
/// private method to convert from Term (internal YAP representation) to
|
||||||
mk(tn);
|
|
||||||
} /// private method to convert from Term (internal YAP representation) to
|
|
||||||
/// YAPTerm
|
/// YAPTerm
|
||||||
// do nothing constructor
|
// do nothing constructor
|
||||||
YAPTerm() { mk(MkVarTerm()); }
|
YAPTerm() { mk(MkVarTerm()); };
|
||||||
// YAPTerm(yhandle_t i) { t = i; };
|
// YAPTerm(yhandle_t i) { t = i; };
|
||||||
/// pointer to term
|
/// pointer to term
|
||||||
YAPTerm(void *ptr);
|
YAPTerm(void *ptr);
|
||||||
@ -51,23 +86,64 @@ public:
|
|||||||
/// extract the tag of a term, after dereferencing.
|
/// extract the tag of a term, after dereferencing.
|
||||||
YAP_tag_t tag();
|
YAP_tag_t tag();
|
||||||
/// copy the term ( term copy )
|
/// copy the term ( term copy )
|
||||||
YAPTerm deepCopy();
|
Term deepCopy();
|
||||||
/// numbervars ( int start, bool process=false )
|
/// numbervars ( int start, bool process=false )
|
||||||
intptr_t numberVars(intptr_t start, bool skip_singletons = false);
|
intptr_t numberVars(intptr_t start, bool skip_singletons = false);
|
||||||
inline Term term() {
|
inline Term term() {
|
||||||
return gt();
|
return gt();
|
||||||
} /// from YAPTerm to Term (internal YAP representation)
|
} /// 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
|
/// fetch a sub-term
|
||||||
YAPTerm &operator[](size_t n);
|
Term &operator[](size_t n);
|
||||||
// const YAPTerm *vars();
|
// const YAPTerm *vars();
|
||||||
/// this term is == to t1
|
/// this term is == to t1
|
||||||
virtual bool exactlyEqual(YAPTerm t1);
|
virtual bool exactlyEqual(YAPTerm t1) {
|
||||||
virtual bool unify(YAPTerm t1); /// t = t1
|
bool out;
|
||||||
virtual bool unifiable(YAPTerm t1); /// we can unify t and t1
|
BACKUP_MACHINE_REGS();
|
||||||
virtual bool variant(
|
out = Yap_eq(gt(), t1.term());
|
||||||
YAPTerm t1); /// t =@= t1, the two terms are equal up to variable renaming
|
RECOVER_MACHINE_REGS();
|
||||||
virtual intptr_t hashTerm(size_t sz, size_t depth,
|
return out;
|
||||||
bool variant); /// term hash,
|
};
|
||||||
|
|
||||||
|
/// 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 isVar() { return IsVarTerm(gt()); } /// type check for unound
|
||||||
virtual bool isAtom() { return IsAtomTerm(gt()); } /// type check for atom
|
virtual bool isAtom() { return IsAtomTerm(gt()); } /// type check for atom
|
||||||
virtual bool isInteger() {
|
virtual bool isInteger() {
|
||||||
@ -88,19 +164,19 @@ public:
|
|||||||
virtual bool isList() { return Yap_IsListTerm(gt()); } /// term is a list
|
virtual bool isList() { return Yap_IsListTerm(gt()); } /// term is a list
|
||||||
|
|
||||||
/// extract the argument i of the term, where i in 1...arity
|
/// 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();
|
BACKUP_MACHINE_REGS();
|
||||||
|
Term tf = 0;
|
||||||
Term t0 = gt();
|
Term t0 = gt();
|
||||||
YAPTerm tf;
|
|
||||||
if (IsApplTerm(t0))
|
if (IsApplTerm(t0))
|
||||||
tf = YAPTerm(ArgOfTerm(i, t0));
|
tf = (ArgOfTerm(i, t0));
|
||||||
else if (IsPairTerm(t0)) {
|
else if (IsPairTerm(t0)) {
|
||||||
if (i == 1)
|
if (i == 1)
|
||||||
tf = YAPTerm(HeadOfTerm(t0));
|
tf = (HeadOfTerm(t0));
|
||||||
else if (i == 2)
|
else if (i == 2)
|
||||||
tf = YAPTerm(TailOfTerm(t0));
|
tf = (TailOfTerm(t0));
|
||||||
} else {
|
} else {
|
||||||
tf = YAPTerm((Term)0);
|
tf = ((Term)0);
|
||||||
}
|
}
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
return tf;
|
return tf;
|
||||||
@ -123,7 +199,24 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// return a string with a textual representation of the term
|
/// 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
|
/// return a handle to the term
|
||||||
inline yhandle_t handle() { return t; };
|
inline yhandle_t handle() { return t; };
|
||||||
@ -171,14 +264,14 @@ class YAPApplTerm : public YAPTerm {
|
|||||||
public:
|
public:
|
||||||
~YAPApplTerm() {}
|
~YAPApplTerm() {}
|
||||||
YAPApplTerm(YAPFunctor f, YAPTerm ts[]);
|
YAPApplTerm(YAPFunctor f, YAPTerm ts[]);
|
||||||
YAPApplTerm(const char *s, std::vector<YAPTerm> ts);
|
//YAPApplTerm(const char *s, std::vector<YAPTerm> ts);
|
||||||
YAPApplTerm(YAPFunctor f);
|
//YAPApplTerm(YAPFunctor f);
|
||||||
YAPFunctor getFunctor();
|
YAPFunctor getFunctor();
|
||||||
YAPTerm getArg(arity_t i) {
|
Term getArg(arity_t i) {
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
Term t0 = gt();
|
Term t0 = gt();
|
||||||
YAPTerm tf;
|
Term tf;
|
||||||
tf = YAPTerm(ArgOfTerm(i, t0));
|
tf = ArgOfTerm(i, t0);
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
return tf;
|
return tf;
|
||||||
};
|
};
|
||||||
@ -209,8 +302,8 @@ class YAPPairTerm : public YAPTerm {
|
|||||||
public:
|
public:
|
||||||
YAPPairTerm(YAPTerm hd, YAPTerm tl);
|
YAPPairTerm(YAPTerm hd, YAPTerm tl);
|
||||||
YAPPairTerm();
|
YAPPairTerm();
|
||||||
YAPTerm getHead() { return YAPTerm(HeadOfTerm(gt())); }
|
Term getHead() { return (HeadOfTerm(gt())); }
|
||||||
YAPTerm getTail() { return YAPTerm(TailOfTerm(gt())); }
|
Term getTail() { return (TailOfTerm(gt())); }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -267,20 +360,20 @@ public:
|
|||||||
return Yap_SkipList(&t1, &tailp);
|
return Yap_SkipList(&t1, &tailp);
|
||||||
}
|
}
|
||||||
/// Extract the nth element.
|
/// Extract the nth element.
|
||||||
YAPTerm &operator[](size_t n);
|
Term &operator[](size_t n);
|
||||||
/// Extract the first element of a list.
|
/// Extract the first element of a list.
|
||||||
///
|
///
|
||||||
/// @param[in] the list
|
/// @param[in] the list
|
||||||
YAPTerm car();
|
Term car();
|
||||||
/// Extract the tail elements of a list.
|
/// Extract the tail elements of a list.
|
||||||
///
|
///
|
||||||
/// @param[in] the list
|
/// @param[in] the list
|
||||||
YAPListTerm cdr() {
|
Term cdr() {
|
||||||
Term to = gt();
|
Term to = gt();
|
||||||
if (IsPairTerm(to))
|
if (IsPairTerm(to))
|
||||||
return YAPListTerm(TailOfTerm(to));
|
return (TailOfTerm(to));
|
||||||
else if (to == TermNil)
|
else if (to == TermNil)
|
||||||
return YAPListTerm();
|
return TermNil;
|
||||||
/* error */
|
/* error */
|
||||||
Yap_Error(TYPE_ERROR_LIST, t, 0);
|
Yap_Error(TYPE_ERROR_LIST, t, 0);
|
||||||
throw YAPError();
|
throw YAPError();
|
||||||
@ -288,7 +381,7 @@ public:
|
|||||||
/// copy a list.
|
/// copy a list.
|
||||||
///
|
///
|
||||||
/// @param[in] the list
|
/// @param[in] the list
|
||||||
YAPListTerm dup();
|
Term dup();
|
||||||
|
|
||||||
/// Check if the list is empty.
|
/// Check if the list is empty.
|
||||||
///
|
///
|
||||||
|
@ -5,13 +5,11 @@ if (PYTHONLIBS_FOUND)
|
|||||||
|
|
||||||
include(FindPythonModule)
|
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})
|
add_library (YAPPython SHARED ${PYTHON_SOURCES})
|
||||||
|
|
||||||
set (PYTHON_HEADERS
|
|
||||||
python.h)
|
|
||||||
|
|
||||||
target_link_libraries(YAPPython libYap ${PYTHON_LIBRARIES})
|
target_link_libraries(YAPPython libYap ${PYTHON_LIBRARIES})
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "python.h"
|
#include "python.h"
|
||||||
|
|
||||||
PyObject *yap_to_python(YAP_Term t, bool eval) {
|
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);
|
PyObject *o = term_to_python(yt, eval);
|
||||||
PL_reset_term_refs(yt);
|
PL_reset_term_refs(yt);
|
||||||
return o;
|
return o;
|
||||||
@ -18,23 +18,14 @@ PyObject *yap_to_python(YAP_Term t, bool eval) {
|
|||||||
* @return a Python object descriptor or NULL if failed
|
* @return a Python object descriptor or NULL if failed
|
||||||
*/
|
*/
|
||||||
PyObject *term_to_python(term_t t, bool eval) {
|
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);
|
YAP_Term yt = YAP_GetFromSlot(t);
|
||||||
switch (PL_term_type(t)) {
|
switch (PL_term_type(t)) {
|
||||||
case PL_VARIABLE: {
|
case PL_VARIABLE: {
|
||||||
PyObject *o = NULL, *pArgs;
|
YAP_Term i = YAP_MkIntTerm(t);
|
||||||
if (eval)
|
return term_to_nametuple(
|
||||||
return NULL;
|
"H", 1, YAP_InitSlot(YAP_MkApplTerm(
|
||||||
if (PyObject_HasAttrString(py_Main, "V"))
|
YAP_MkFunctor(YAP_LookupAtom("H"), 1), 1, &i)));
|
||||||
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);
|
|
||||||
};
|
};
|
||||||
case PL_ATOM: {
|
case PL_ATOM: {
|
||||||
YAP_Atom at = YAP_AtomOfTerm(yt);
|
YAP_Atom at = YAP_AtomOfTerm(yt);
|
||||||
@ -54,8 +45,8 @@ PyObject *term_to_python(term_t t, bool eval) {
|
|||||||
else if (strcmp(s, "{}") == 0)
|
else if (strcmp(s, "{}") == 0)
|
||||||
o = PyDict_New();
|
o = PyDict_New();
|
||||||
/* return __main__,s */
|
/* return __main__,s */
|
||||||
else if ((o = PyRun_String(s, Py_single_input,
|
else if ((o = PyRun_String(s, Py_single_input, PyEval_GetGlobals(),
|
||||||
PyEval_GetGlobals(), PyEval_GetLocals()))) {
|
PyEval_GetLocals()))) {
|
||||||
Py_IncRef(o);
|
Py_IncRef(o);
|
||||||
return o;
|
return o;
|
||||||
} else if (PyObject_HasAttrString(py_Main, s)) {
|
} else if (PyObject_HasAttrString(py_Main, s)) {
|
||||||
@ -83,8 +74,7 @@ PyObject *term_to_python(term_t t, bool eval) {
|
|||||||
} break;
|
} break;
|
||||||
case PL_STRING: {
|
case PL_STRING: {
|
||||||
char *s = NULL;
|
char *s = NULL;
|
||||||
if (!PL_get_chars(t, &s,
|
if (!PL_get_chars(t, &s, REP_UTF8 | CVT_ATOM | CVT_STRING | BUF_MALLOC)) {
|
||||||
REP_UTF8 | CVT_ATOM | CVT_STRING | BUF_MALLOC)) {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#if PY_MAJOR_VERSION < 3
|
#if PY_MAJOR_VERSION < 3
|
||||||
|
@ -186,7 +186,25 @@ foreign_t python_to_term(PyObject *pVal, term_t t) {
|
|||||||
functor_t f;
|
functor_t f;
|
||||||
const char *s;
|
const char *s;
|
||||||
if ((s = (Py_TYPE(pVal)->tp_name))) {
|
if ((s = (Py_TYPE(pVal)->tp_name))) {
|
||||||
|
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);
|
f = PL_new_functor(PL_new_atom(s), sz);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
f = PL_new_functor(ATOM_t, sz);
|
f = PL_new_functor(ATOM_t, sz);
|
||||||
if (!PL_unify_functor(t, f))
|
if (!PL_unify_functor(t, f))
|
||||||
|
@ -513,9 +513,7 @@ static long get_len_of_range(long lo, long hi, long step) {
|
|||||||
{"A27", NULL}, {"A28", NULL}, {"A29", NULL}, {"A29", NULL},
|
{"A27", NULL}, {"A28", NULL}, {"A29", NULL}, {"A29", NULL},
|
||||||
{"A30", NULL}, {"A31", NULL}, {"A32", NULL}, {0}};
|
{"A30", NULL}, {"A31", NULL}, {"A32", NULL}, {0}};
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *structseq_str(PyObject *iobj) {
|
||||||
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 REPR_BUFFER_SIZE 512
|
||||||
@ -531,8 +529,8 @@ structseq_str(PyObject *iobj)
|
|||||||
endofbuf = &buf[REPR_BUFFER_SIZE - 5];
|
endofbuf = &buf[REPR_BUFFER_SIZE - 5];
|
||||||
|
|
||||||
/* "typename(", limited to TYPE_MAXSIZE */
|
/* "typename(", limited to TYPE_MAXSIZE */
|
||||||
len = strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE :
|
len =
|
||||||
strlen(typ->tp_name);
|
strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE : strlen(typ->tp_name);
|
||||||
strncpy(pbuf, typ->tp_name, len);
|
strncpy(pbuf, typ->tp_name, len);
|
||||||
pbuf += len;
|
pbuf += len;
|
||||||
*pbuf++ = '(';
|
*pbuf++ = '(';
|
||||||
@ -560,8 +558,7 @@ structseq_str(PyObject *iobj)
|
|||||||
*pbuf++ = ' ';
|
*pbuf++ = ' ';
|
||||||
removelast = 1;
|
removelast = 1;
|
||||||
Py_DECREF(repr);
|
Py_DECREF(repr);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
strcpy(pbuf, "...");
|
strcpy(pbuf, "...");
|
||||||
pbuf += 3;
|
pbuf += 3;
|
||||||
removelast = 0;
|
removelast = 0;
|
||||||
@ -579,10 +576,7 @@ structseq_str(PyObject *iobj)
|
|||||||
return PyUnicode_FromString(buf);
|
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 REPR_BUFFER_SIZE 512
|
||||||
@ -598,8 +592,8 @@ structseq_repr(PyObject *iobj)
|
|||||||
endofbuf = &buf[REPR_BUFFER_SIZE - 5];
|
endofbuf = &buf[REPR_BUFFER_SIZE - 5];
|
||||||
|
|
||||||
/* "typename(", limited to TYPE_MAXSIZE */
|
/* "typename(", limited to TYPE_MAXSIZE */
|
||||||
len = strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE :
|
len =
|
||||||
strlen(typ->tp_name);
|
strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE : strlen(typ->tp_name);
|
||||||
strncpy(pbuf, typ->tp_name, len);
|
strncpy(pbuf, typ->tp_name, len);
|
||||||
pbuf += len;
|
pbuf += len;
|
||||||
*pbuf++ = '(';
|
*pbuf++ = '(';
|
||||||
@ -627,8 +621,7 @@ structseq_repr(PyObject *iobj)
|
|||||||
*pbuf++ = ' ';
|
*pbuf++ = ' ';
|
||||||
removelast = 1;
|
removelast = 1;
|
||||||
Py_DECREF(repr);
|
Py_DECREF(repr);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
strcpy(pbuf, "...");
|
strcpy(pbuf, "...");
|
||||||
pbuf += 3;
|
pbuf += 3;
|
||||||
removelast = 0;
|
removelast = 0;
|
||||||
@ -645,9 +638,10 @@ structseq_repr(PyObject *iobj)
|
|||||||
|
|
||||||
return PyUnicode_FromString(buf);
|
return PyUnicode_FromString(buf);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static PyObject *
|
PyObject *term_to_nametuple(const char *s, int arity, term_t t) {
|
||||||
term_to_nametuple( const char *s, int arity, term_t t) {
|
#if PY_MAJOR_VERSION >= 3
|
||||||
PyTypeObject *typp;
|
PyTypeObject *typp;
|
||||||
PyObject *o;
|
PyObject *o;
|
||||||
PyObject *key = PyUnicode_FromString(s);
|
PyObject *key = PyUnicode_FromString(s);
|
||||||
@ -690,9 +684,15 @@ term_t tleft = PL_new_term_ref();
|
|||||||
((PyStructSequence *)o)->ob_base.ob_size = arity;
|
((PyStructSequence *)o)->ob_base.ob_size = arity;
|
||||||
|
|
||||||
return o;
|
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
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *bip_range(term_t t) {
|
static PyObject *bip_range(term_t t) {
|
||||||
long ilow = 0, ihigh = 0, istep = 1;
|
long ilow = 0, ihigh = 0, istep = 1;
|
||||||
@ -957,12 +957,9 @@ PyObject *compound_to_pytree(term_t t, functor_t fun) {
|
|||||||
const char *s;
|
const char *s;
|
||||||
if (!(s = PL_atom_chars(name)))
|
if (!(s = PL_atom_chars(name)))
|
||||||
return NULL;
|
return NULL;
|
||||||
#if PY_MAJOR_VERSION >= 3
|
|
||||||
return term_to_nametuple(s, arity, t);
|
|
||||||
#else
|
|
||||||
term_t tleft;
|
term_t tleft;
|
||||||
int i;
|
int i;
|
||||||
PyObject *c, *o1;
|
PyObject *o1;
|
||||||
o = PyTuple_New(arity);
|
o = PyTuple_New(arity);
|
||||||
tleft = PL_new_term_ref();
|
tleft = PL_new_term_ref();
|
||||||
for (i = 0; i < arity; i++) {
|
for (i = 0; i < arity; i++) {
|
||||||
@ -975,13 +972,7 @@ PyObject *compound_to_pytree(term_t t, functor_t fun) {
|
|||||||
/* pArg reference stolen here: */
|
/* pArg reference stolen here: */
|
||||||
PyTuple_SET_ITEM(o, i, pArg);
|
PyTuple_SET_ITEM(o, i, pArg);
|
||||||
}
|
}
|
||||||
if (PyObject_HasAttrString(py_Yapex, "T"))
|
return term_to_nametuple(s, arity, 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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_len1, FUNCTOR_curly1, FUNCTOR_ord1, FUNCTOR_range1, FUNCTOR_range2,
|
||||||
FUNCTOR_range3, FUNCTOR_sum1, FUNCTOR_pointer1, FUNCTOR_complex2,
|
FUNCTOR_range3, FUNCTOR_sum1, FUNCTOR_pointer1, FUNCTOR_complex2,
|
||||||
FUNCTOR_plus2, FUNCTOR_sub2, FUNCTOR_mul2, FUNCTOR_div2, FUNCTOR_hat2,
|
FUNCTOR_plus2, FUNCTOR_sub2, FUNCTOR_mul2, FUNCTOR_div2, FUNCTOR_hat2,
|
||||||
FUNCTOR_colon2, FUNCTOR_comma2, FUNCTOR_equal2, FUNCTOR_sqbrackets2,
|
FUNCTOR_colon2, FUNCTOR_equal2, FUNCTOR_sqbrackets2, FUNCTOR_dot2;
|
||||||
FUNCTOR_dot2;
|
|
||||||
|
|
||||||
PyObject *py_Main;
|
PyObject *py_Main;
|
||||||
PyObject *py_Builtin;
|
PyObject *py_Builtin;
|
||||||
|
@ -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_pyeval(term_t t, functor_t fun);
|
||||||
extern PyObject *compound_to_pytree(term_t t, functor_t fun);
|
extern PyObject *compound_to_pytree(term_t t, functor_t fun);
|
||||||
|
|
||||||
|
@ -1,24 +1,7 @@
|
|||||||
|
|
||||||
import yap
|
import yap
|
||||||
import sys
|
import sys
|
||||||
|
import collections
|
||||||
# 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)
|
|
||||||
|
|
||||||
|
|
||||||
def query_prolog(engine, s):
|
def query_prolog(engine, s):
|
||||||
|
|
||||||
@ -29,34 +12,54 @@ def query_prolog(engine, s):
|
|||||||
print(e.args[1])
|
print(e.args[1])
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
#construct a query from a one-line string
|
||||||
|
# q is opaque to Python
|
||||||
q = engine.query(s)
|
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
|
ask = True
|
||||||
|
# launch the query
|
||||||
while answer(q):
|
while answer(q):
|
||||||
vs = q.namedVarsCopy()
|
# this new vs should contain bindings to vars
|
||||||
if vs:
|
vs= q.namedVars()
|
||||||
|
#numbervars
|
||||||
i=0
|
i=0
|
||||||
|
# iteratw
|
||||||
for eq in vs:
|
for eq in vs:
|
||||||
name = eq[0]
|
name = eq[0]
|
||||||
bind = eq[1]
|
# this is tricky, we're going to bind the variables in the term so thay we can
|
||||||
if bind.isVar():
|
# output X=Y. The Python way is to use dictionares.
|
||||||
var = yap.YAPAtom('$VAR')
|
#Instead, we use the T function to tranform the Python term back to Prolog
|
||||||
f = yap.YAPFunctor(var, 1)
|
binding = yap.T(eq[1])
|
||||||
bind.unify(yap.YAPApplTerm(f, (name)))
|
if binding.isVar():
|
||||||
|
binding.unify(name)
|
||||||
else:
|
else:
|
||||||
i = bind.numberVars(i, True)
|
i = binding.numberVars(i, True)
|
||||||
print(name.text() + " = " + bind.text())
|
print(name + " = " + binding.text())
|
||||||
|
#ok, that was Prolog code
|
||||||
print("yes")
|
print("yes")
|
||||||
|
# deterministic = one solution
|
||||||
if q.deterministic():
|
if q.deterministic():
|
||||||
|
# done
|
||||||
q.close()
|
q.close()
|
||||||
return
|
return
|
||||||
if ask:
|
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'):
|
if s.startswith(';') or s.startswith('y'):
|
||||||
continue
|
continue
|
||||||
elif s.startswith('#'):
|
elif s.startswith('#'):
|
||||||
exec(s.lstrip('#'))
|
exec(s.lstrip('#'))
|
||||||
elif s.startswith('a'):
|
elif s.startswith('*') or s.startswith('a'):
|
||||||
ask = False
|
ask = False
|
||||||
|
continue
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
print("No (more) answers")
|
print("No (more) answers")
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
#CHECK: SWIG
|
#CHECK: SWIG
|
||||||
|
option (WITH_SWiG
|
||||||
|
"Allow Python->YAP and Java->YAP" ON)
|
||||||
|
|
||||||
|
IF (WITH_SWiG)
|
||||||
|
|
||||||
find_host_package (SWIG)
|
find_host_package (SWIG)
|
||||||
macro_log_feature (SWIG_FOUND "Swig"
|
macro_log_feature (SWIG_FOUND "Swig"
|
||||||
"Use SWIG Documentation System "
|
"Use SWIG Documentation System "
|
||||||
@ -20,7 +25,10 @@ if (ANDROID)
|
|||||||
add_subdirectory(android)
|
add_subdirectory(android)
|
||||||
else(ANDROID)
|
else(ANDROID)
|
||||||
add_subdirectory(python)
|
add_subdirectory(python)
|
||||||
add_subdirectory(java)
|
# add_subdirectory(java)
|
||||||
endif(ANDROID)
|
endif(ANDROID)
|
||||||
|
|
||||||
endif (SWIG_FOUND)
|
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)
|
set(CMAKE_JNI_TARGET 1)
|
||||||
ADD_JAR( NativeJar
|
ADD_JAR( NativeJar
|
||||||
SOURCES "../../../docs/icons/yap_16x16x32.png"
|
SOURCES "${CMAKE_SOURCES_DIR}/docs/icons/yap_16x16x32.png"
|
||||||
DEPENDS Native
|
DEPENDS Native
|
||||||
PROPERTIES OUTPUT_NAME Native
|
PROPERTIES OUTPUT_NAME Native
|
||||||
)
|
)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//package pt.up.fc.dcc.yap;
|
//package pt.up.yap;
|
||||||
|
//
|
||||||
import java.io.* ;
|
import java.io.* ;
|
||||||
//import YAP.* ;
|
import pt.up.yap.* ;
|
||||||
class JavaYAP {
|
class JavaYAP {
|
||||||
|
|
||||||
YAPQuery q;
|
YAPQuery q;
|
||||||
@ -34,10 +34,10 @@ class JavaYAP {
|
|||||||
q.close();
|
q.close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
YAPListTerm vs = q.namedVars();
|
YAPTerm vs = YAPTerm( q.namedVars() );
|
||||||
System.out.println("Another one "+vs);
|
System.out.println("Another one "+vs);
|
||||||
while(!vs.nil()){
|
while(!vs.nil()){
|
||||||
YAPTerm eq = vs.car();
|
eq = YAPTerm( vs.car() );
|
||||||
//outputText.append(Integer.toString(i) + ": " + eq.text() );
|
//outputText.append(Integer.toString(i) + ": " + eq.text() );
|
||||||
System.out.println(":\t" + eq.getArg(1).text() + " = " + eq.getArg(2).text() +"\n" );
|
System.out.println(":\t" + eq.getArg(1).text() + " = " + eq.getArg(2).text() +"\n" );
|
||||||
vs = vs.cdr();
|
vs = vs.cdr();
|
||||||
|
@ -3,6 +3,15 @@
|
|||||||
|
|
||||||
INCLUDE(${SWIG_USE_FILE})
|
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)
|
if (PYTHONLIBS_FOUND)
|
||||||
|
|
||||||
@ -16,44 +25,45 @@ if (PYTHONLIBS_FOUND)
|
|||||||
|
|
||||||
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTIES CPLUSPLUS ON)
|
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 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 ("setup.py.cmake" "setup.py" )
|
||||||
configure_file ("../yap.i" "yap.i" )
|
#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_ADD_MODULE(Py2YAP python ../yap.i )
|
||||||
# SWIG_LINK_LIBRARIES(Py2YAP ${PYTHON_LIBRARIES} Yap++ libYap YAPPython)
|
SWIG_LINK_LIBRARIES(Py2YAP ${PYTHON_LIBRARIES} Yap++ YAPPython libYap)
|
||||||
# set_target_properties ( ${SWIG_MODULE_Py2YAP_REAL_NAME} PROPERTIES
|
set_target_properties ( ${SWIG_MODULE_Py2YAP_REAL_NAME} PROPERTIES
|
||||||
# NO_SONAME ON )
|
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}' ) )"
|
execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'platlib' ) )"
|
||||||
# OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH
|
OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH
|
||||||
# OUTPUT_STRIP_TRAILING_WHITESPACE )
|
OUTPUT_STRIP_TRAILING_WHITESPACE )
|
||||||
# get_filename_component ( _ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE )
|
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} )
|
file ( RELATIVE_PATH _REL_PYTHON_MOULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH} )
|
||||||
|
|
||||||
# set ( PYTHON_MODULE_PATH
|
set ( PYTHON_MODULE_PATH
|
||||||
# ${_REL_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
|
# add_custom_target ( py2yap ALL
|
||||||
COMMAND ${PYTHON_EXECUTABLE} setup.py bdist
|
# COMMAND ${PYTHON_EXECUTABLE} setup.py bdist
|
||||||
DEPENDS ../yap.i YAPPython )
|
# DEPENDS ../yap.i YAPPython )
|
||||||
|
|
||||||
|
|
||||||
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} install
|
# install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} install
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
|
# 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.so DESTINATION ${PYTHON_MODULE_PATH} )
|
||||||
# INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/yap.py 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} )
|
|
||||||
|
|
||||||
|
|
||||||
if ( DOCUMENTATION AND DOXYGEN_FOUND )
|
if ( DOCUMENTATION AND DOXYGEN_FOUND )
|
||||||
|
@ -8,18 +8,21 @@ if platform.system() == 'Darwin':
|
|||||||
else:
|
else:
|
||||||
my_extra_link_args = []
|
my_extra_link_args = []
|
||||||
|
|
||||||
|
python_sources = ['yap.i'] # ,'../../CXX/yapi.cpp'] + ${PYTHON_SOURCES}
|
||||||
|
|
||||||
|
set objects = split('${OBJECTS}',';')
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name = "yap",
|
name = "yap",
|
||||||
version = "0.1",
|
version = "0.1",
|
||||||
ext_modules=[Extension('_yap', ['yap.i'],
|
ext_modules=[Extension('_yap', python_sources,
|
||||||
define_macros = [('MAJOR_VERSION', '1'),
|
define_macros = [('MAJOR_VERSION', '1'),
|
||||||
('MINOR_VERSION', '0'),
|
('MINOR_VERSION', '0'),
|
||||||
('_YAP_NOT_INSTALLED_', '1'),
|
('_YAP_NOT_INSTALLED_', '1'),
|
||||||
('YAP_PYTHON', '1')],
|
('YAP_PYTHON', '1')],
|
||||||
runtime_library_dirs=['${dlls}'],
|
runtime_library_dirs=['${dlls}'],
|
||||||
swig_opts=['-modern','-outcurrentdir', '-c++', '-py3','-I${CMAKE_SOURCE_DIR}/CXX'],
|
swig_opts=['-modern','-outcurrentdir', '-c++', '-py3','-I${CMAKE_SOURCE_DIR}/CXX'],
|
||||||
library_dirs=['../../..','../../../CXX',
|
library_dirs=['../../.o.',
|
||||||
'../../python',
|
|
||||||
'.'],
|
'.'],
|
||||||
extra_link_args=my_extra_link_args,
|
extra_link_args=my_extra_link_args,
|
||||||
libraries=['Yap++','Yap','YAPPython'],
|
libraries=['Yap++','Yap','YAPPython'],
|
||||||
|
@ -1,68 +1,53 @@
|
|||||||
/* example.i */
|
/* example.i */
|
||||||
%module(directors = "1") yap
|
%module(directors = "1") yap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Language independent exception handler
|
// Language independent exception handler
|
||||||
%include exception.i
|
%include exception.i
|
||||||
%include stdint.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
|
#ifdef SWIGPYTHON
|
||||||
|
|
||||||
%typemap(typecheck) Term* {
|
//include python/python.i
|
||||||
$1 = PySequence_Check($input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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(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);}
|
%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
|
// Language independent exception handler
|
||||||
|
|
||||||
%exception next {
|
%exception next {
|
||||||
@ -291,26 +276,6 @@ LOCAL_Error_TYPE = YAP_NO_ERROR;
|
|||||||
|
|
||||||
#endif
|
#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 */
|
/* turn on director wrapping Callback */
|
||||||
%feature("director") YAPCallback;
|
%feature("director") YAPCallback;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user