pyCalc
I
decided that I wanted a better calculator than the built in version.
There are lots of command line tools around, many of which do some
interesting things (such as symbolic mathematics) and so I decided that
I'd just write a front end for one of these (yacas).
My main
requirements were that I should not need to use the infernal pop-up
keyboard (infernal because it pops up and down at will, which is
annoying as it alters the screen layout), so that means I need to have
a working numeric and alphanumeric keypad. I decided that it ought to
have some more keys for useful mathematical functions (powers, trig
stuff), etc.
Anyway, I decided that this would be a good
opportunity to learn Python, so I bought Python in a nutshell,
downloaded the pygtk documentation (would prefer a paper book) and
started looking for some code that did something similar so I could
avoid the tedious process of writing skeleton code.
I found a
piece of code called pyRPN (http://toykeeper.net/programs/pyrpn/) and
decided that it looked about right, so set about ripping out its
innards and replacing them with mine.
Code structure
When
I started I decided that I wanted to write a generic frontend for any
command line backend. The one I'm focussing on at the moment is Yacas,
but you could use lots of other things (mathomatic, octave, giac, etc.).
To
this end I wrote the code as a load of modules - modules to interface
with the backend (so you can use pipes, tcp-ip, whatever your heart
desires, and the backend allows), modules for the user interface
(modules for the alpha keypad, for the numeric keypad, for the shortcut
keypads).
This means that if you add a new backend, you can keep
the standard alpha and numeric keypads if you want to, or replace them
with your own. The shortcut keypads probably need to be replaced or at
least tweaked to make sure they output the correct names (e.g. is it
sqrt() or sqr() in your backend?).
Download
Link to tarball
Link to yacas .deb and to Yacas description page (http://yacas.sourceforge.net/homepage.html)
Nothing much to do with this, but here's Octave and Gnuplot (not sure whether these work).
ToDo
There are still lots of things I'd like to get this code to do:
Pretty Printing
I'd
like to display the equations and results on the screen in a pretty
(e.g. like TeX) form. There are some pieces of code to use TeX for this
purpose. I'm not sure how much space TeX would require to install, but
this seems like overkill.
There are also MathML tools, and a
GTK+ widget to display MathML. Two problems here, I'd need to convert
my equations and results into MathML (though it's probably not a bad
idea to use a fixed format to send to the renderer - this will help as
and when other backends are added. The second problem is that I'd need
to wrap this C widget and turn it into a Python widget. Not impossible,
but will require some reading and some work.
If I choose to go
the route of using some fixed format to feed to a renderer, the
question is which format? TeX is pretty widespread and well supported
(yacas can output in TeX format). Yacas also does output in OpenMath
format. I don't know much about this, but it's another option.
The
final option is just to write my own renderer in Python. I think this
would be the most interesting, I'll have to see if I can build up
enough motivation to do it ;)
More backends/interfaces
The
whole point of the module system is to allow different backends to be
added in with as little hassle as possible. Equally the use of modules
allows different interfaces to the calculator - so you can add a new
page/replace a current page to show different shortcut keys, or alter
the layout of the numeric keys or the alpha keys, etc.
Tooltips
It
would be interesting to provide tooltips for some of the more complex
functions (e.g. differentiation, where are the limits placed, or the
variable to differentiate with respect to, etc.?)
Improved text box
Currently the text box just takes input, I'd like to make it a bit more intelligent:
Different taps to select different parts of the current string. E.g.:
single tap for insert cursor (or if the tap is beyond the current string, cursor to the end),
double tap to select a word (or if the tap is beyond the current string, select all),
triple tap to select between brackets.
Bracket highlighting to aid input/editing.
Add more functionality
Small spreadsheet?
Graphing