Jython definately supports metaclasses(and by all accounts fully
supports them), django uses them extensively, and they are show to
work fine there. So my guess is the problem is in sympy for the
metaclass issue. I don't know enough about either to be useful beyond
that.
On Oct 8, 8:58 pm, "Ondrej Certik" <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I'd be interested in getting sympy[0] run on top of jython. It only
> depends on pure python and has an extensive test suite. I noticed
> that django recently started to work on top of jython, so if you have
> nothing to port now, below you can find a lot of problems. :)
>
> Here is how to play with it (I tried jython latest alpha 3):
>
> $ git clone git://git.sympy.org/sympy.git
> $ cd sympy
> $ ~/ext/jython2.5a3/jython -c "import sympy"
> Traceback (most recent call last):
> File "<string>", line 1, in <module>
> File "sympy/__init__.py", line 16, in <module>
> from sympy.core import *
> File "sympy/core/__init__.py", line 4, in <module>
> from basic import Basic, S, C, sympify
> File "sympy/core/basic.py", line 236, in <module>
> class Basic(AssumeMeths):
> TypeError: Error when calling the metaclass bases
> mro() returned base with unsuitable layout ('Basic')
>
> This works in python2.4, 2.5, 2.6 and pypy. It seems like some
> problems with metaclasses, because this "patch" gets rid of it:
>
> $ git diff
> diff --git a/sympy/core/basic.py b/sympy/core/basic.py
> index d5e4262..d369ec2 100644
> --- a/sympy/core/basic.py
> +++ b/sympy/core/basic.py
> @@ -268,7 +268,7 @@ class Basic(AssumeMeths):
>
> """
>
> - __metaclass__ = BasicMeta
> + #__metaclass__ = BasicMeta
>
> __slots__ = ['_mhash', # hash value
> '_args', # arguments
>
> Unfortunately, the next problem is java.lang.NullPointerException,
> which I have no idea how to fix:
>
> $ ~/ext/jython2.5a3/jython -c "import sympy"
> Traceback (most recent call last):
> File "<string>", line 1, in <module>
> File "sympy/__init__.py", line 16, in <module>
> from sympy.core import *
> File "sympy/core/__init__.py", line 6, in <module>
> from numbers import Number, Real, Rational, Integer, igcd, ilcm,
> RealNumber, \
> java.lang.NullPointerException
> at
> org.python.compiler.CodeCompiler.visitLambda(CodeCompiler.java:1798)
> at org.python.antlr.ast.Lambda.accept(Lambda.java:53)
> at org.python.antlr.Visitor.visit(Visitor.java:26)
> at org.python.compiler.CodeCompiler.makeArray(CodeCompiler.java:342)
> at org.python.compiler.CodeCompiler.visitCall(CodeCompiler.java:1503)
> at org.python.antlr.ast.Call.accept(Call.java:114)
> at org.python.antlr.Visitor.visit(Visitor.java:26)
> at org.python.compiler.CodeCompiler.visitCall(CodeCompiler.java:1487)
> at org.python.antlr.ast.Call.accept(Call.java:114)
> at org.python.antlr.Visitor.visit(Visitor.java:26)
> at
> org.python.compiler.CodeCompiler.doDecorators(CodeCompiler.java:430)
> at
> org.python.compiler.CodeCompiler.visitFunctionDef(CodeCompiler.java:419)
> at org.python.antlr.ast.FunctionDef.accept(FunctionDef.java:98)
> at org.python.antlr.ast.Module.traverse(Module.java:65)
> at org.python.antlr.Visitor.traverse(Visitor.java:12)
> at org.python.compiler.CodeCompiler.visitModule(CodeCompiler.java:310)
> at org.python.antlr.ast.Module.accept(Module.java:58)
> at org.python.antlr.Visitor.visit(Visitor.java:26)
> at org.python.compiler.CodeCompiler.parse(CodeCompiler.java:269)
> at org.python.compiler.Module.PyCode(Module.java:467)
> at org.python.compiler.Module.compile(Module.java:646)
> at org.python.core.imp.compileSource(imp.java:203)
> at org.python.core.imp.createFromSource(imp.java:224)
> at org.python.core.imp.loadFromSource(imp.java:478)
> at org.python.core.imp.find_module(imp.java:379)
> at org.python.core.PyModule.impAttr(PyModule.java:109)
> at org.python.core.imp.import_next(imp.java:566)
> at org.python.core.imp.import_name(imp.java:664)
> at org.python.core.imp.importName(imp.java:724)
> at org.python.core.ImportFunction.load(__builtin__.java:1268)
> at org.python.core.ImportFunction.__call__(__builtin__.java:1264)
> at org.python.core.PyObject.__call__(PyObject.java:251)
> at org.python.core.__builtin__.__import__(__builtin__.java:1225)
> at org.python.core.imp.importFromAs(imp.java:775)
> at org.python.core.imp.importFrom(imp.java:761)
> at sympy.core$py.f$0(sympy/core/__init__.py)
> at sympy.core$py.call_function(sympy/core/__init__.py)
> at org.python.core.PyTableCode.call(PyTableCode.java:187)
> at org.python.core.PyCode.call(PyCode.java:14)
> at org.python.core.imp.createFromCode(imp.java:258)
> at org.python.core.imp.createFromPyClass(imp.java:107)
> at org.python.core.imp.loadFromSource(imp.java:471)
> at org.python.core.imp.find_module(imp.java:379)
> at org.python.core.PyModule.impAttr(PyModule.java:109)
> at org.python.core.imp.import_next(imp.java:566)
> at org.python.core.imp.import_logic(imp.java:623)
> at org.python.core.imp.import_name(imp.java:679)
> at org.python.core.imp.importName(imp.java:724)
> at org.python.core.ImportFunction.load(__builtin__.java:1268)
> at org.python.core.ImportFunction.__call__(__builtin__.java:1264)
> at org.python.core.PyObject.__call__(PyObject.java:251)
> at org.python.core.__builtin__.__import__(__builtin__.java:1225)
> at org.python.core.imp.importAll(imp.java:802)
> at sympy$py.f$0(sympy/__init__.py)
> at sympy$py.call_function(sympy/__init__.py)
> at org.python.core.PyTableCode.call(PyTableCode.java:187)
> at org.python.core.PyCode.call(PyCode.java:14)
> at org.python.core.imp.createFromCode(imp.java:258)
> at org.python.core.imp.createFromPyClass(imp.java:107)
> at org.python.core.imp.loadFromSource(imp.java:471)
> at org.python.core.imp.find_module(imp.java:379)
> at org.python.core.imp.import_next(imp.java:564)
> at org.python.core.imp.import_name(imp.java:664)
> at org.python.core.imp.importName(imp.java:724)
> at org.python.core.ImportFunction.load(__builtin__.java:1268)
> at org.python.core.ImportFunction.__call__(__builtin__.java:1264)
> at org.python.core.PyObject.__call__(PyObject.java:251)
> at org.python.core.__builtin__.__import__(__builtin__.java:1225)
> at org.python.core.imp.importOne(imp.java:735)
> at org.python.pycode._pyx0.f$0(<string>)
> at org.python.pycode._pyx0.call_function(<string>)
> at org.python.core.PyTableCode.call(PyTableCode.java:187)
> at org.python.core.PyCode.call(PyCode.java:14)
> at org.python.core.Py.runCode(Py.java:1200)
> at org.python.core.Py.exec(Py.java:1227)
> at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:122)
> at org.python.util.jython.run(jython.java:258)
> at org.python.util.jython.main(jython.java:114)
>
> java.lang.NullPointerException: java.lang.NullPointerException
>
> Is there some way to get jython print some more useful error? Anyway,
> by trial and error, the problem is somewhere in the
> sympy/core/numbers.py file, so when commenting all places that import
> it, one gets this error:
>
> $ ~/ext/jython2.5a3/jython -c "import sympy"
> Traceback (most recent call last):
> File "<string>", line 1, in <module>
> File "sympy/__init__.py", line 16, in <module>
> from sympy.core import *
> File "sympy/core/__init__.py", line 14, in <module>
> from function import Lambda, WildFunction, Derivative, diff,
> FunctionClass, \
> File "sympy/core/function.py", line 76, in <module>
> class Function(Basic):
> File "sympy/core/function.py", line 71, in __new__
> return type.__new__(cls, name, bases, attrdict)
> TypeError: Error when calling the metaclass bases
> mro() returned base with unsuitable layout ('Function')
>
> So one again needs to comment out the lines with:
>
> - __metaclass__ = FunctionClass
> + #__metaclass__ = FunctionClass
>
> in couple more classes and then also:
>
> -class WildFunction(Function, Atom):
> +class WildFunction(Function):
>
> Until one finally gets:
>
> $ ~/ext/jython2.5a3/jython -c "import sympy"
> Traceback (most recent call last):
> File "<string>", line 1, in <module>
> File "sympy/__init__.py", line 16, in <module>
> from sympy.core import *
> File "sympy/core/__init__.py", line 20, in <module>
> for _n, _cls in Basic.singleton.items():
> AttributeError: type object 'Basic' has no attribute 'singleton'
>
> Which is due to the fact that we commented out of the metaclasses. So
> to sum up, there are two problems:
>
> 1) jython's metaclasses are different to cpython, so either jython or
> sympy needs to be investigated and fixed
> 2) there is some problem in sympy/core/numbers.py, that importing it
> throws java.lang.NullPointerException
>
> if some jython developer has any ideas to move forward, it'd be awesome.
>
> Ondrej
>
> [0]http://code.google.com/p/sympy/
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sympy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sympy?hl=en
-~----------~----~----~----~------~----~------~--~---