Ticket #6781: ecllib.2.patch

File ecllib.2.patch, 4.8 KB (added by nbruin, 10 years ago)

Patch to allow library access to ecl

  • module_list.py

    # HG changeset patch
    # User Nils Bruin <nbruin@sfu.ca>
    # Date 1250897833 25200
    # Node ID 46591309c07db942ae9386e98793f0c2d2b45b17
    # Parent  1cc3f09b9bf5e9d5f11ce7656c87bfe982c38f57
    Library interface for ECL
    
    HG
    
    diff -r 1cc3f09b9bf5 -r 46591309c07d module_list.py
    a b  
    373373    ##
    374374    ################################
    375375
     376    Extension('sage.libs.ecl',
     377              sources = ["sage/libs/ecl/ecl.pyx"],
     378              libraries = ["ecl"],
     379              include_dirs = [SAGE_ROOT+'/local/include/ecl/'],
     380              depends = [SAGE_ROOT + '/local/include/ecl/ecl.h']),
     381
    376382    Extension('sage.libs.flint.flint',
    377383              sources = ["sage/libs/flint/flint.pyx"],
    378384              libraries = ["csage", "flint", "gmp", "gmpxx", "m", "stdc++"],
  • new file sage/libs/ecl/ecl.pyx

    diff -r 1cc3f09b9bf5 -r 46591309c07d sage/libs/ecl/ecl.pyx
    - +  
     1cdef extern from "ecl/ecl.h":
     2  ctypedef long int cl_fixnum
     3  ctypedef cl_fixnum cl_narg
     4  ctypedef void *cl_object
     5
     6  void cl_boot(int argc, char **argv)
     7
     8  char *ecl_base_string_pointer_safe(cl_object f)
     9
     10  cl_object c_string_to_object(char *s)
     11  cl_object cl_write_to_string(cl_narg narg, cl_object obj, ...)
     12
     13  cl_object cl_eval(cl_object form)
     14
     15  cl_object cl_identity(cl_object x)
     16  cl_object cl_null(cl_object x)
     17  cl_object cl_symbolp(cl_object x)
     18  cl_object cl_atom(cl_object x)
     19  cl_object cl_consp(cl_object x)
     20  cl_object cl_listp(cl_object x)
     21  cl_object cl_numberp(cl_object x)
     22  cl_object cl_integerp(cl_object x)
     23  cl_object cl_rationalp(cl_object x)
     24  cl_object cl_floatp(cl_object x)
     25  cl_object cl_realp(cl_object x)
     26  cl_object cl_complexp(cl_object x)
     27  cl_object cl_characterp(cl_object x)
     28  cl_object cl_stringp(cl_object x)
     29  cl_object cl_bit_vector_p(cl_object x)
     30  cl_object cl_vectorp(cl_object x)
     31  cl_object cl_simple_string_p(cl_object x)
     32  cl_object cl_simple_bit_vector_p(cl_object x)
     33  cl_object cl_simple_vector_p(cl_object x)
     34  cl_object cl_arrayp(cl_object x)
     35  cl_object cl_packagep(cl_object x)
     36  cl_object cl_functionp(cl_object x)
     37  cl_object cl_compiled_function_p(cl_object x)
     38  cl_object cl_eq(cl_object x, cl_object y)
     39  cl_object cl_eql(cl_object x, cl_object y)
     40  cl_object cl_equal(cl_object x, cl_object y)
     41  cl_object cl_equalp(cl_object x, cl_object y)
     42  cl_object si_fixnump(cl_object x)
     43
     44  cl_object cl_car(cl_object x)
     45  cl_object cl_cdr(cl_object x)
     46 
     47  bool floatp(cl_object x)
     48  bool ecl_numberp(cl_object x)
     49  bool ecl_eql(cl_object x, cl_object y)
     50  bool ecl_equal(cl_object x, cl_object y)
     51  bool ecl_equalp(cl_object x, cl_object y)
     52  bool ecl_stringp(cl_object x)
     53
     54  int cl_shutdown() 
     55
     56cdef cl_object T, NIL
     57
     58cdef bool ecl_consp(cl_object x):
     59  return cl_consp(x) == T
     60
     61def init_ecl():
     62  global T,NIL
     63  cdef char *argv[1]
     64  cdef Object a
     65  argv[0]=""
     66  cl_boot(0, argv)
     67  a=ecl_eval("T")
     68  T=a.obj
     69  a=ecl_eval("NIL")
     70  NIL=a.obj
     71 
     72def shutdown_ecl():
     73  cl_shutdown()
     74
     75cdef class Object:
     76  cdef cl_object obj
     77 
     78  def __cinit__(self):
     79   
     80    self.obj = <cl_object> NULL
     81   
     82  cdef void set_obj(Object self, cl_object o):
     83    self.obj = o
     84 
     85  def __str__(self):
     86    cdef cl_object s
     87    s = cl_write_to_string(1, self.obj)
     88    return ecl_base_string_pointer_safe(s)
     89
     90  def __repr__(self):
     91    cdef cl_object s
     92    s = cl_write_to_string(1, self.obj)
     93    return '<ECL: '+ecl_base_string_pointer_safe(s)+' >'
     94
     95  cdef bool obj_eq(Object left, Object right):
     96    return left.obj == right.obj
     97   
     98  def __richcmp__(left, right, int op):
     99    cdef cl_object o1,o2
     100    print type(left),left
     101    print type(right),right
     102    if op == 2 or op == 3:
     103      if (type(left) == type(right)):
     104        v = Object.obj_eq(left,right)
     105      else:
     106        v = 0
     107      if op == 2:
     108        return v
     109      else:
     110        return not(v)
     111    else:
     112      raise NotImplementedError, "can only test for equality for now"
     113
     114  def eval(self):
     115    cdef cl_object o
     116    o = cl_eval(self.obj)
     117    obj = Object()
     118    Object.set_obj(obj,o)
     119    return obj
     120   
     121  cpdef python(self):
     122    cdef cl_object obcar
     123    cdef cl_object obcdr
     124    if ecl_consp(self.obj):
     125      obcar = cl_car(self.obj)
     126      carob = Object()
     127      Object.set_obj(<Object> carob,<cl_object> obcar)
     128
     129      obcdr = cl_cdr(self.obj)
     130      cdrob = Object()
     131      Object.set_obj(<Object> cdrob,<cl_object> obcdr)
     132     
     133      return [carob.python(),cdrob.python()]
     134    else:
     135      return self
     136   
     137def string_to_object(s):
     138  cdef cl_object o
     139  cdef char *str
     140  str=s
     141  o = c_string_to_object(str)
     142  obj = Object()
     143  Object.set_obj(obj,o)
     144  return obj
     145
     146def ecl_eval(s):
     147  return string_to_object(s).eval()