fix Maybe for exception handling!!! = Macros = list comprehensions in [] Maybe make [] a reader macro (don't forget to provide a way to rebuild the original string, if possible) - or make it #[ instead - like all the other special reader macros = Fix Bugs = 2*-5 2* -5 loading modules (for example the one where GetLastError! is in) causes GetLastError() to be clobbered. '\ (is interpreted as a lambda. Also '\\). = Builtin Types (for Values) = numbers: 5. arbitrary-precision fixed point, 6. complex numbers, literals: #C(3.2 2) equality (numbers, strings(?) and booleans (?) and symbols (?) and lists (?)) and non-equality. Builtin ops: power Array literals: #(a b c) = Packaging = add l2p dependency on the GUI part. = Packages = packages (namespaces) import xyz hiding (a, b, c) import qualified ... = Data Structures = sorting: quicksort (?). searching: binary search, bisect. trees: binary trees, tries, red black trees. = Error Handling = ... `catch` \e error e = Pie-in-the-Sky = provide hooks for big integers (?) (+3) = \x (x+3) #| commented out |# make it possible to define custom operators in the REPL function to join buffers (memoryview) merge Str and Integer into one (for integer, the str() is reversed, though). (or merge Str and List into one) move str() to the actual language = GUI = GUI: allow deletion environment nodes (includes usage check in the rest of the environment). GUI: allow moving of environment nodes. GUI: allow compacting of environment nodes. TUI: if trying to pass a path to a file that does not exist, it doesn't create it on exit. Should it? TUI: allow multi-line entry in history (maybe just use a global history used by everyone) = Beauty = In raiseMissingSymbolError, make sure to include (client) moduleFilename in the resulting message. Right now, (‒) is used for the prefix operator. This isn't distinguishable much from (-), maybe get rid of the special case (how?)... Math: indentation for 'if, 'rec, 'let, ';, ': - don't forget nested ifs. pattern-match a:b:c:nil back to the [] macro (this is already done for the Cons builtin but not if the Cons has not yet been built). nested lists: line-break only for the second list if the first list is short enough. Indentation: [(] note how the auto) shouldn't close down yet - but it should close if we are back at the same paren level than we were before. range-with-unlimited-end <=> compare Continuation Passing Style Compiler amb = Performance = just remove gc_allocator from BigUnsigned (it's opaque anyway). just make CProcedure const. add reduction rule "rec e => e (rec e)" use hash table for dispatching FFI performance optimisation: use the lowest bit to signify pointers (1=it is one). This will have problems with native pointers maybe, so also override the native allocator. degrade from Integer to Int when possible. $! strict applicator make AST::Symbol const everywhere (introduce a SymbolT ?) maybe delay and force tail recursion elimination. cache numbers for some time? http://en.wikipedia.org/wiki/Lehmer%27s_GCD_algorithm allow optimized versions of nodes (be careful to preserve the original for documentation purposes, though) strictness analysis (Wadler) escape analysis (Java) = Parser = "# " as line comment starter (=> rem) eval AST userInitialEnvironment add custom literal parsers make an extra "]" emit a nicer error message = Correctness = move prefix_operator_P into LOperatorPrecedenceList and make it look there "in real time". Builtins.nan? (Builtins.(/) 1.0 0.0) => #t (currently it's a fraction, so not detected as NaN) newline => $ ?? What about newlines after "in" ? Probably a bad idea, since indentation is already the same as ($) and that's enough. (odd? inf) is true because it's implemented as "not even" and inf is not even. Don't reduce in REPL_execute. Instead make sure the printer etc evaluates thunks before using them. Note that a thunk isn't just an application node since then it wouldn't know how to reduce the arguments. Hence there's a need for storing the environment and the expression to evaluate for later use (i.e. a promise). Have the predicates check for non-SymbolReference non-quoted symbols or non-executed applications and if so, return "we can't do it"? Floats only work to 3E38, it seems. What about higher numbers? (there's no such limit for 3E-999999) It would be possible to make numerals like 3E3 mean 3000 and not 3000.0 - do we want that? Reintroduce FALLBACK, i.e. tail [] shouldn't reduce. If there are open parens, ignore indentation (note that this is the LEXER and so it technically can't distinguish between quoted or macro braces and actual braces). sort exports Just representing Str as a Integer would be a lot less weird and automatically allow comparisons to work as one would expect. However, it's unconventional. However, this would only be fast for little-endian architectures (as BigUnsigned Blks are ordered LSB first). Moreover, I don't think that Strings are manipulated that often. add atomic? flag to allocateRecord and duplicateRecord. Either don't throw C++ exceptions or actually represent them somehow when one is thrown while reducing. exception handling? ftp://ftp.cs.indiana.edu/pub/scheme-repository/doc/prop/exceptions.ss put "describe" into module dispatcher. make it possible to disable the searching for modules in the current directory! ARM: support FPA10 floating-point accelerator (80 bit registers) import: once importing a name which is already in the environment, auto-add a generic function? module: once an unknown identifier is encountered, maybe auto-provide them to the importer so he can fill in what is needed. (infixl 1 whatever) \(**) (fn? Builtins) should be true since a module can be used exactly like a function can (that it isn't one is just an implementation detail!) - so RModule "are" functions. allow building our own OperationPrecedenceList from within 5D. Fix HashTable to use a prime size. What about comparing (-0.0) and 0.0 ? Handle division by zero for ratios? -D_FORTIFY_SOURCE=1 Maybe disable macros in a 'quote. Don't hang on trying to optimize 1/∞ Is that correct? (requireModule "Arithmetic").divmod 2 1.0 => [2.0 0.0] Maybe use tgmath.h standardized 'remainder: http://pubs.opengroup.org/onlinepubs/009695399/functions/remainder.html move the entire REPL into 5D code (self-hosted REPL). TODO: readline bindings. = Debugging Macros = trace untrace step disassemble = Multithreading = Multithreading: per-thread mutable boxes (monadic) (Thread-local storage). = GC = (by default, make allocators use GC_uncollectable_malloc - done by LD_PRELOAD) = Modules = String.make 10 'x' String.lowercase "MARY" string-upcase strcmp Messagebox custom buttons move all the builtins into a .so file and load them via FFI. support reloading of modules in a special debugger. Note that it is (and should be) impossible to also change existing bindings automatically, so it wouldn't be that useful. = Interop = Windows COM support (interfaces, refcounting, ...) Windows COM strings Full Unicode strings DECIMAL type (suffix m or M) Nicer Fortran Call-by-name support (i.e. allow creation of a temporary and pass a pointer to it to the Fortran subroutine) Buffer, Memoryview = Free Symbols = ` { } ~ = OS module = OS.openFile! OS.withFile! OS.closeFile! better: OS.fopen! OS.fclose! OS.fflush! = Runtime Convenience = nvl = Native Library Integration = libtinfo => ncurses 5.7-2 = Tools = Find doc coverage. Remove unused imports / variables / ... = Optimisations = When there is some binding that isn't using things from the enclosing lexical scope in the first place, just move it further out. If it's already far out and swapping wouldn't help, maybe collect all bindings into one frame. Make sure not to shadow variables if it would change meaning. What to do with the non-optimised versions? Keep storing them or just store a reference to the file and position they were from? = Clean Up = Evaluators/Builtins.cc: just use the new _PROC macros instead of hand-crafting. put ([) into the operator precedence list as a prefix operator? Same for (#export)? Probably not since it's magically quoting and/or changing OPL.