]> gitweb.factorcode.org Git - factor.git/commitdiff
recursive type inference
authorSlava Pestov <slava@factorcode.org>
Fri, 31 Dec 2004 01:46:20 +0000 (01:46 +0000)
committerSlava Pestov <slava@factorcode.org>
Fri, 31 Dec 2004 01:46:20 +0000 (01:46 +0000)
TODO.FACTOR.txt
factor/jedit/FactorCompletion.java
library/inference/words.factor
library/math/integer.factor
library/test/inference.factor

index e0810084a195c4e74d0f9adc6653e4be1fefb78a..aa43a2f9d4411c08842967e722284a11556d9d04 100644 (file)
@@ -8,7 +8,6 @@
 + inference/dataflow:\r
 \r
 - type inference\r
-- handle odd base cases, with code after ifte\r
 \r
 + compiler:\r
 \r
@@ -37,9 +36,7 @@
 - stream server can hang because of exception handler limitations\r
 - listener should be multithreaded\r
 - compile all, infer all commands\r
-- type something -- no completions -- hit another key -- not inserted\r
 - faster completion\r
-- sidekick: still parsing too much\r
 - errors don't always disappear\r
 - NPE in ErrorHighlight\r
 - maple-like: press enter at old commands to evaluate there\r
@@ -48,6 +45,7 @@
 \r
 + kernel:\r
 \r
+- after bootstrapping, classes hash is messed up\r
 - do partial objects cause problems?\r
 - profiler is inaccurate: wrong word on cs\r
 - better i/o scheduler\r
index 654b77dcf1c854f01c702e9718d72db664a81eba..7807fa52241d393bfb5522d413b86a824641ad16 100644 (file)
@@ -88,15 +88,21 @@ public class FactorCompletion extends SideKickCompletion
        public boolean handleKeystroke(int selectedIndex, char keyChar)
        {
                if(keyChar == '\t' || keyChar == '\n')
+               {
                        insert(selectedIndex);
+                       return false;
+               }
+               else if(keyChar == ' ')
+               {
+                       insert(selectedIndex);
+                       textArea.userInput(' ');
+                       return false;
+               }
                else
+               {
                        textArea.userInput(keyChar);
-
-               boolean ws = (ReadTable.DEFAULT_READTABLE
-                       .getCharacterType(keyChar)
-                       == ReadTable.WHITESPACE);
-
-               return !ws;
+                       return true;
+               }
        }
 
        public ListCellRenderer getRenderer()
index fdcd3c3119dec1f260e9510592301bf5d466ea02..6a82eb5756ba20eca4fce947804648068cb84eaf 100644 (file)
@@ -132,20 +132,22 @@ M: symbol (apply-word) ( word -- )
         ] when
     ] when ;
 
+: decompose ( x y -- effect )
+    #! Return a stack effect such that x*effect = y.
+    2unlist >r
+    swap 2unlist >r
+    over length over length - head nip
+    r> append
+    r> 2list ;
+
 : base-case ( word -- effect )
+    effect swap
     [
         inferring-base-case on
         copy-inference
         inline-compound
         inferring-base-case off
-    ] with-scope ;
-
-: decompose ( x y -- effect )
-    #! Return a stack effect such that x*effect = y.
-    2unlist >r swap 2unlist swap length tail append
-    ! workaround
-    [ drop object ] map
-    r> 2list ;
+    ] with-scope decompose ;
 
 : recursive-word ( word label -- )
     #! Handle a recursive call, by either applying a previously
@@ -155,7 +157,7 @@ M: symbol (apply-word) ( word -- )
         drop word-name " does not have a base case." cat2 throw
     ] [
         2dup [ drop #call-label ] [ nip #call ] ifte
-        rot base-case effect swap decompose (consume/produce)
+        rot base-case (consume/produce)
     ] ifte ;
 
 : apply-word ( word -- )
@@ -181,10 +183,6 @@ M: symbol (apply-word) ( word -- )
 
 \ call [ infer-call ] "infer" set-word-property
 
-! These are due to bugs and will be removed
-\ * [ [ number number ] [ number ] ] "infer-effect" set-word-property
-\ gcd [ [ number number ] [ number ] ] "infer-effect" set-word-property
-
 \ undefined-method t "terminator" set-word-property
 \ not-a-number t "terminator" set-word-property
 \ throw t "terminator" set-word-property
index 182a11775ef277073e85e4221cddb9553d6de552..520feaef3953e3c3715ccf0f9c1a3a9655d925ef 100644 (file)
@@ -40,15 +40,18 @@ USE: math
         (fraction>)
     ] ifte ; inline
 
+: division-by-zero ( x y -- )
+    "Division by zero" throw drop ;
+
 : integer/ ( x y -- x/y )
     dup 0 number= [
-        "Division by zero" throw drop
+        division-by-zero
     ] [
         dup 0 < [
             swap neg swap neg
         ] when
         2dup gcd tuck /i >r /i r> fraction>
-    ] ifte ;
+    ] ifte ; inline
 
 M: fixnum number= fixnum= ;
 M: fixnum < fixnum< ;
index 3c88df9f672a1d1fd62253fd60f7cb0fe50627d2..fa519f7075224d12b741d4e9cfb8717d7f3a56a1 100644 (file)
@@ -15,12 +15,19 @@ USE: generic
 [ [ [ object ] [ object object ] ] [ [ object ] f ] decompose ]
 unit-test
 
-[ [ [ fixnum fixnum ] f ] ]
+[ [ [ cons vector cons integer object cons ] [ cons vector cons ] ] ]
 [
-    [ [ rational rational ] [ rational fixnum ] ]
-    [ [ object ] f ] decompose
+    [ [ vector ] [ cons vector cons integer object cons ] ]
+    [ [ vector ] [ cons vector cons ] ]
+    decompose
+]
+
+[ [ [ object ] [ object ] ] ]
+[
+    [ [ object number ] [ object ] ]
+    [ [ object number ] [ object ] ]
+    decompose
 ]
-unit-test
 
 : old-effect ( [ in-types out-types ] -- [ in | out ] )
     uncons car length >r length r> cons ;