PLAN
====

This file collects Iguana related information which doesn't belong in any 
particular release. This includes design records, notes, ideas and bugs.


Language
--------

- if statement
    if x > 0 
        ...
    else
        ...
    end
- unless statement
    unless x > 0  
      ...  
    end 
- statement modifiers
    y = 0 if x == 0
    y = 0 unless x != 0
- elif statement
    if x == 1
    elif x == 2
    elif x == 3
    else
    end
- while statement
    while x > 0
        ...
    end 
- for statement
    for x in sequence 
       ..
    end
- functions
    def fib(n)
      if n < 2
        return n
      else
        return fib(n - 2) + fib(n - 1)
      end
    end
- local goto statement
- raise statement 
- in-line functions 
    def f(x) = x**2
    def g(x,y) = cos(x) + cos(y)
- ternary operator 
    z = x when C else y
    z = c ? x : i
- extended print statement
    x = 13; print "%s is equal to %d" % "x", x
- extended import statement
    from module import name1, name2, ..., nameN
    from module import name1 as alias1, name2 as alias2, ..., nameN as aliasN
- oct and hex string's escape codes
- recognize oct and hex constants
    h = 0xFF
    o = 0777
- tuple packing and unpacking (multiple assignment)
    a,b = 10,1   # a = 10; b = 1;
    a,b = b,a    # swap without a third variable
- object's attributes 
    c = 3 + 4i # logically equivalent to c = complex(3, 4i)
    print "real part", c.real 
    print "imag part", c.imag
- set builder notation
    A = { w | property on w}
- sequence in sequence statement
- docstring syntax:
    iguana> a = 2.99792458e+8  """speed of light (m/s)"""
    iguana> help(a)
    speed of light (m/s)
    iguana>
- shift operators << >> for integers
- augmented assign operators: += -= /= *= **= >>= <<= etc 
- argc and argv built-ins ARGC ARGV
- reverse() built-in. Actually we've an implementation of reverse only
  for string objects (provided by the string module) but, a *generic* method 
  that works also for other sequential types, should be very useful.
- substitute `mod' keyword with `%'
- substitute `div' keyword with `//'
- substitute `is div' keyword with `|'
- profiling of Iguana code (iguana -p) 
- debugging of Iguana code (iguana -d)


Objects 
-------

- other numeric objects:
    long integer (use GNU multiple precision arithmetic library)
    complex
- other sequential objects:
    matrix
    set 
- graph objects and protocol
    simple graph
    directed graph
    multi-graph
    directed multi-graph
- poly object
- file object
- fast allocation for integers, floats and strings
- objects allocation
- garbage collection of objects 
- pretty print function for array type


C API
-----

- convert exceptions to stand-alone objects, not a string objects (current 
  implementation). Provide also extension API like IgExc_New() etc.
- Ig_GetArgs() 
    optional calling form (see built-in range()) 
    new format character 'l' for C long
    new format character 'd' for C double
- FP support 
 

Documentation
-------------

- correct and improve the existing documents: you can re-write some parts of
  existing documents in order to correct mistakes and to re-write some
  non-clear sections. This can be done by sending a mail to the author. If
  you plan to change a document, please contact the author in order to make
  sure he is not working on the part you want to modify.
- new documents: language reference and embedding/extending/C API
- HACKING (LaTeX version) 


Demos and Examples
------------------

- more examples (cover most of the syntax, objects and builtin methods usage) 
- more C embed/extend demos
    define a module exception (i.e. for euromodule define a UnknownValuta)
    extend the inittab with a module
    add more comments and hints
- a C++ class for embedding the interpreter 


Standard Modules
----------------

- GNU units module 
   "GNU `units' converts between different systems of units. It can
    handle multiplicative scale changes. It can also handle nonlinear
    conversions such as Celsius to Fahrenheit."
- gnuplot module
- improve the stats module:
    weighted average and deviance 
    covariance
    codeviance
    regression line
    kurtosis
- nt.gcd() variable number of arguments
- nt.lcm() variable number of arguments
- max() variable number of arguments
- min() variable number of arguments
- nt.extgcd(a,b) -> (d,x,y) where d = gcd(a,b) = ax + by
- nt.nextprime(n) -> next prime after n
- math.root(n,r) -> r-th root of n 
- math.powm(b,e,m) -> modulo powering, b^e%m
- math.isinf(), math.isfinite() and math.isnan()??
- test module (will be used in the new testing suite)
- FFT module (an original idea by Andrey Semenov)
- other modules (see Modules/xxmodule.c to implement a new module)


Build Environment
-----------------

- build a shared library (libiguana.so) with libtool 
- optimized builds (-fomit-frame-pointer -O2)


Ports
-----
 
- Free-BSD, Open-BSD, most of other unices
- Win9x (devcpp, msvs6)
- DOS (turbo C++ 3.0)??
- MacOS X??


Misc
----

- comment the code
- walk in the code to implement all the TODO items
- make the dubious English much decent 
- some other cool features. Do you have any ideas on how to improve Iguana?


Assigned Works
==============

Marzio Pattano <marptt@tin.it>:
- GTK2 GUI: embed the Iguana interpreter, load/save/run script, help,
  cut/copy/paste
- improve the test suite

Nicola Gigante <gigabytes_sw@libero.it>
- solve module
- new C embedding demos


Bugs
====

This section is used as a scratch pad by me. It is a list of known issues 
that need to be fixed:

- numeric coercion doesn't free the coerced value 
- better error reporting routines
- GNU readline module don't works on some platforms. I'll investigate...
