summary refs log tree commit diff stats
path: root/todo.txt
diff options
context:
space:
mode:
Diffstat (limited to 'todo.txt')
-rwxr-xr-xtodo.txt220
1 files changed, 74 insertions, 146 deletions
diff --git a/todo.txt b/todo.txt
index 7e940c3e4..7da08f2bb 100755
--- a/todo.txt
+++ b/todo.txt
@@ -1,186 +1,114 @@
 version 0.9.2
 =============
-  
-- test&finish first class iterators:
-  * nested iterators
-  * arglist as a type?
 
-- fix closure bug finally
-- overloading based on ASTs: 'constraint' should not be in PType but for the
-  parameter *symbol*
+- implement constructors + full 'not nil' checking
+- ``restrict`` pragma + backend support
+- fix: 'result' is not properly cleaned for NRVO
+- fix: exhaustive checking in case statements
 
-  - implement ``partial`` pragma for partial evaluation: easily done with AST
-    overloading
-  - ``hoist`` pragma for loop hoisting: can be easily done with 
-    AST overloading + global
+version 0.9.4
+=============
 
-- improve the compiler as a service
-- ``=`` should be overloadable; requires specialization for ``=``
-- implement constructors
 - make 'bind' default for templates and introduce 'mixin'; 
   special rule for ``[]=``
 - implicit deref for parameter matching; overloading based on 'var T'
+- ``=`` should be overloadable; requires specialization for ``=``
 - optimize genericAssign in the code generator
 
 
-Bugs
-----
+version 0.9.X
+=============
+
+- FFI:
+  * test libffi on windows
+  * test: times.format with the FFI
+- test&finish first class iterators:
+  * nested iterators
+- implement the missing features wrt inheritance
+- improve the compiler as a service
+- better support for macros that rewrite procs
+- macros need access to types and symbols (partially implemented)
+- result = result shr 8 for the "system()" wrapper
+- rethink the syntax/grammar:
+  * parser is not strict enough with newlines
+  * change comment handling in the AST
 
-- sneaking with qualifiedLookup() is really broken!
-- bug: aporia.nim(968, 5) Error: ambiguous identifier: 'DELETE' -- 
-  use a qualifier
-- bug: the parser is not strict enough with newlines: 'echo "a" echo "b"' 
-  compiles
-- bug: blocks can "export" an identifier but the CCG generates {} for them ...
+
+Concurrency
+-----------
+
+- shared memory heap: ``shared ref`` etc. The only hard part in the GC is to
+  "stop the world". However, it may be worthwhile to generate explicit 
+  (or implicit) syncGC() calls in loops. Automatic loop injection seems
+  troublesome, but maybe we can come up with a simple heuristic. (All procs
+  that `new` shared memory are syncGC() candidates... But then 'new' itself
+  calls syncGC() so that's pointless.) Hm instead of an heuristic simply
+  provide a ``syncgc`` pragma to trigger compiler injection --> more general:
+  an ``injectLoop`` pragma
+- 'writes: []' effect; track reads/writes for shared types
+- use the effect system for static deadlock prevention and race detection
 
 
 version 0.9.XX
 ==============
 
-- improve not-nil types
-- make:
-  p(a, b): 
-    echo a
-    echo b
-  
-  the same as:
-  
-  p(a, b, proc() =
-    echo a
-    echo b)
-
-- implement read/write tracking in the effect system
-- implement the "snoopResult" pragma; no, make a strutils with string append
-  semantics instead ...
-- implement "closure tuple consists of a single 'ref'" optimization
-- JS gen:
-  - fix exception handling
 - object branch transitions can't work with the current 'reset'; add a 'reset'
   with an additional parameter --> re-evaluate this issue after constructors
   have been added
-- fix remaining closure bugs:
-  - test evals.nim with closures
-  - what about macros with closures?
-
-- allow implicit forward declarations of procs via a pragma (so that the
-  wrappers can deactivate it)
-- rethink the syntax: distinction between expr and stmt is unfortunate; 
-  indentation handling is quite complex too; problem with exception handling
-  is that often the scope of ``try`` is wrong and apart from that ``try`` is
-  a full blown statement; a ``try`` expression might be a good idea to make
-  error handling more light-weight
-- fix destructors; don't work yet when used as expression
-- make use of ``tyIter`` to fix the implicit items/pairs issue
-- better support for macros that rewrite procs
-- macros need access to types and symbols (partially implemented)
+- fix destructors; don't work yet when used as expression; alternative for 
+  version 1: disallow expressions yielding a type with a destructor that are
+  not in a 'let/var' context  (p(a.openFile, b.openFile) makes no sense anyway)
 - document nimdoc properly finally
 - make 'clamp' a magic for the range stuff
-- we need to support iteration of 2 different data structures in parallel
-- proc specialization in the code gen for write barrier specialization
-- tlastmod returns wrong results on BSD (Linux, MacOS X: works)
-- nested tuple unpacking; tuple unpacking in non-var-context
-- make pegs support a compile-time option and make c2nim use regexes instead
-  per default?
-- 'const' objects including case objects
-- 'export' feature
-- from buggymodule import * except optBroken, optBroken2
-- think about ``{:}.toTable[int, string]()``
-- mocking support with ``tyProxy`` that does:
-  o.p(x) --> p(o, x) -->  myMacro(p, o, x)
-  
-  This is really the opposite of ``tyExpr``:
-  * For parameter ``tyExpr`` any argument matches.
-  * Argument ``tyProxy`` matches any parameter.
-  
+- better type syntax for functions and tuples: tuple(int, int); (int,int)->int
 
-Library
--------
 
-- suffix trees
-- locale support; i18n module
-- bignums
+Not essential for 1.0.0
+=======================
 
-
-Low priority
-------------
-
-- change how comments are part of the AST
+- 'const' objects including case objects
+- mocking support with ``tyProxy`` that does: fallback for ``.`` operator
+- allow implicit forward declarations of procs via a pragma (so that the
+  wrappers can deactivate it)
+- implement the "snoopResult" pragma; no, make a strutils with string append
+  semantics instead ...
+- implement "closure tuple consists of a single 'ref'" optimization
+- optimize method dispatchers
 - ``with proc `+`(x, y: T): T`` for generic code
 - new feature: ``distinct T with operations``
-- implement the "easy" constructors idea
+- arglist as a type (iterator chaining); variable length type lists for generics
 - resizing of strings/sequences could take into account the memory that
   is allocated
-- timeout for locks
-- compilation cache:
-  - adapt thread var emulation to care about the new merge operation
-  - check for interface changes; if only the implementation changes, no
-    need to recompile clients; er ... what about templates, macros or anything
-    that has inlining semantics?
 - codegen should use "NIM_CAST" macro and respect aliasing rules for GCC
-- GC: precise stack marking;
-  escape analysis for string/seq seems to be easy to do too;
-  even further write barrier specialization
-- GC: marker procs Boehm GC
 - implement marker procs for message passing
-- optimize method dispatchers
 - activate more thread tests
-- implement ``--script:sh|bat`` command line option; think about script 
-  generation
 - implement closures that support nesting of *procs* > 1
 
 
-Further optimization ideas
-==========================
+GC
+==
 
-- To optimize further copies away, you want to gather the additional
-  information inlining would provide, but don't inline for code size reasons.
+- precise stack marking; embrace C++ code generation for that
+- marker procs for Boehm GC
+- implement 'mixed' GC mode
 
 
-Version 2 and beyond
-====================
+Optimizations
+=============
 
-- shared memory heap: ``shared ref`` etc. The only hard part in the GC is to
-  "stop the world". However, it may be worthwhile to generate explicit 
-  (or implicit) syncGC() calls in loops. Automatic loop injection seems
-  troublesome, but maybe we can come up with a simple heuristic. (All procs
-  that `new` shared memory are syncGC() candidates... But then 'new' itself
-  calls syncGC() so that's pointless.) Hm instead of an heuristic simply
-  provide a ``syncgc`` pragma to trigger compiler injection --> more general:
-  an ``injectLoop`` pragma
+- optimize 'if' with a constant condition
+- escape analysis for string/seq seems to be easy to do too;
+  even further write barrier specialization
+- inlining of first class functions
+- proc specialization in the code gen for write barrier specialization
 
-- const ptr/ref  --> pointless because of aliasing; 
-  much better: 'writes: []' effect
-
-- language change: inheritance should only work with reference types, so that
-  the ``type`` field is not needed for objects! --> zero overhead aggregation
-  BETTER: ``of`` and safe object conversions only work with ref objects. Same
-  for multi methods.
-  
-- explicit nil types?
-  * nil seq[int]
-  * nil string
-  * nil ref int
-  * nil ptr THallo
-  * nil proc 
-
-- better for backwards compatibility: default nilable, but ``not nil``
-  notation:
-  
-  type
-    PWindow = ref TWindow not nil
-    
-  The problem with ``nil`` is that the language currently relies on it for
-  implicit initialization. Initialization is different from assignment. The
-  issues can "easily" dealt with by ensuring:
-  
-    var x = myProc() # checks myProc() initializes every pointer explicitely
-
-- guards for the 'case' statement; generalized case statement;
-  a guard looks like: 
-  
-    case x
-    of nkStmtList if x.value == 0: 
-  
-  a generalized case statement looks like:
-    
-    case x with `=~`
+
+Bugs
+====
+
+- sneaking with qualifiedLookup() is really broken!
+- aporia.nim(968, 5) Error: ambiguous identifier: 'DELETE' -- 
+  use a qualifier
+- blocks can "export" an identifier but the CCG generates {} for them ...
+- JS gen: fix exception handling
+- the better scoping for locals is the wrong default for endb
>574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682