Change History ************** 2.0 === There is now a compatible Objective C solution that works on iOS and Mac Enhanced :doc:`jmp-compile` to evaluate constants in the source (eg ``3+4`` is replaced with ``7``, and ``True or 7`` is replaced with ``True``). It will also omit unreachable code (eg ``if False``). You can turn this optimisation off with :option:`--no-optimizations`. You can also supply your own constants such as ``DEBUG=True`` or ``VERSION="2.3"``. The resulting bytecode still works correctly even against |project| version 1.0. :doc:`jmp-compile` detects trying to assign to builtin constants (eg ``True=0``) :doc:`jmp-compile` now understands list comprehensions. The resulting bytecode still works correctly even against |project| version 1.0. Added toPyReprString for Java ``bool`` now always returns a value. Before it would give TypeError for unknown types, which now give ``True``. Correct Java string.split for various corner cases. Made Java implemented methods work correctly as dictionary keys. Calling a Java non-varargs method with an incorrect number of args now gives the correct exception type (``TypeError``) Deal with -2147483648 / -1 (gives -2147483648 because + 2147483648 would be an overflow). On Intel processors this operation would cause a `hardware fault <http://kqueue.org/blog/2012/12/31/idiv-dos/>`__ like dividing by zero does, so similar precautions are taken. Note that |project| only uses 32 bit signed integers. Fix global lookup for LOAD_NAME (:issue:`14`) 1.2 === Filled in the :jdoc:`cause <java/lang/Throwable.html#getCause()>` for :ref:`ExecutionError <ExecutionError>` and added toDetailedString() method. Added several annotations that help when the file is compiled with very strict warnings. Minor documentation tweaks and updates. Added toDetailedString() on the Exception which provides additional useful detail for logging and analytics. 1.1 === All Java non-public items marked private to avoid them showing up in completions if you copied the code to your own package. (:issue:`1`) Do not use `String.isEmpty()` as it doesn't exist on Android (:issue:`2`) Public entry points are synchronized to prevent concurrent usage (:issue:`3`) Added `dict.get(key, default)` (:issue:`5`) Dictionary members can be obtained and set via attribute style access too (:issue:`6`):: a={"foo": 3} # Get print a["foo"], a.foo # Set a.bar=7 print a["bar"], a.bar Added *is/is not* operator. Behind the scenes this translates *x is y* into *id(x) == id(y)*. It is possible to do a form of object orientation keeping data and the functions that operate on it together in the same dictionary as :ref:`documented here <pyobject>` (:issue:`7`) Code that attempted to do a rich compare of dictionaries was removed and their :func:`id` is used instead. (:ref:`comparisons`). Added dict.copy (:issue:`8`) Added :doc:`jmp-compile` option to only do a syntax check Fixed returns within for loops (:issue:`10`)