TODO ==== - Get rid of String.valueOf calls in CalcCanvas whenever possible, and replace by passing line, len, to avoid copying of char array - For plot and par, do not cache whole Image but only function values - Better error handling: in various places, NullPointerException/OutOfMemoryError/ArrayIndexOutOfBounds etc. may be thrown e.g. if input is very long or device is out of memory. - Ability to redefine a function. Easiest way: when input line is 'f(' and user presses clear, only delete '(' not whole line. - Make full screen optional. - Option to use unicode character for pi (unless there is some automatic way of finding out whether the Font contains it). - Conditional (ternary) operator: f:=x<2?1:f(x-2)+f(x-1). Clearly, this makes recursive functions useful, so we would need to allow those. - When navigating to a history entry and executing it again, without first changing it, move it on top of the history instead of creating a new history entry. - Context-sensitive KeyState menus which only display those operations which are currently valid. - Make plotting interruptible. - Display progress bar when plotting. - Optionally rotate the plot by 90 degrees (so the user has to rotate their phone), yielding a landscape orientation which may be better suited to many plots. - Anti-aliasing of the plotted curve to make it look smoother. - Make the plot screen interactive: user can move around and zoom (both plot() and map()). - The plot labels should honour the "smart rounding" setting. - Add unit tests, get good test coverage. - Support pointer for pushing buttons (for touch-screen mobile phones). - Improve usability (how?). - Support different key layouts (e.g. for Nokia E61). - Improve web page. - Setup mailing list. - Declare open-source status on web page, link to svn & mailing list. DONE ==== - Optionally leaving out the * for multiplication. Note, this sometimes makes things look strange - e.g. when f is a number not a function, then 'f(3)' is valid. - Only plot when the user presses the fire button. - A two-dimensional plotter, for functions with two parameters, that maps function values to colour or grayscale values. Perhaps call it map(). - map() plot should indicate values corresponding to white and black. - Rewrite Expr and Symbol to use a stack-based "virtual machine" - the speed gain should be useful especially for map(). - plot() should accept a general expression involving x as its first parameter. Similar for map(). - Allow expressions like '1+1)*(2+2' - Exit application on BACK key. - Fix bugs with function re-definition. - Parametric plot: par(f,g,t_min,t_max) - For par(), perhaps rename x to t to avoid confusion. - Add [xy]{min,max} labels to par(). - markError should mark the whole token, not just a single character - Make axes drawing optional in plot() and par(). - Make label drawing optional in plot(), par() and map(). - Option of unit aspect ratio for plot(), map() and par(). For map(), this changes its arity from 5 to 4. - Perhaps change the way submenus are indicated to displaying a green triangle in the lower right corner. - When cursor is inside a plot command, result line shows description of current parameter (e.g. "function of x") IDEAS ===== - Dimensions, unit conversion (300m/s -> km/h; sin(60deg); 100ft^2 -> m^2). - Contextual help for functions. - Allow custom function and parameter names (how?) (e.g.: BMI(weight, height) := weight/height^2). - Additional, optional function packages. - Peephole optimizing and inlining before plot() and map() - To optimize map(), write a peephole optimizer. Then, for each y, modify the program by replacing each occurrence of PAR_Y by a literal with the current value of y, and optimize the program. Evaluate it for each x. (In many cases, this may actually slow down things.) - Differentiate, integrate, find extrema, find zeros (numerically). - Symbolic differentiation.