]> gitweb.factorcode.org Git - factor.git/commitdiff
dlists no longer have a length slot; tweak dlist code so that types infer better
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 16 Nov 2008 11:53:25 +0000 (05:53 -0600)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 16 Nov 2008 11:53:25 +0000 (05:53 -0600)
12 files changed:
basis/compiler/compiler.factor
basis/compiler/tree/dead-code/liveness/liveness.factor
basis/compiler/tree/def-use/def-use.factor
basis/compiler/tree/recursive/recursive.factor
basis/deques/deques-docs.factor
basis/deques/deques.factor
basis/dlists/dlists-docs.factor
basis/dlists/dlists-tests.factor
basis/dlists/dlists.factor
basis/search-deques/search-deques-docs.factor
basis/search-deques/search-deques-tests.factor
basis/search-deques/search-deques.factor

index b01a835b4a806a1a3650c0033decd6ca37ec739b..a6afc4b243af077ff2d4cbdfed3bb8eacebcb198 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2004, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel namespaces arrays sequences io debugger
-words fry continuations vocabs assocs dlists definitions math
-threads graphs generic combinators deques search-deques
+words fry continuations vocabs assocs dlists definitions
+math threads graphs generic combinators deques search-deques
 prettyprint io stack-checker stack-checker.state
 stack-checker.inlining compiler.errors compiler.units
 compiler.tree.builder compiler.tree.optimizer
index 08bfde55b2c85b856ab31b1501863fc1f0900cf9..44b71935c8f0fea7a6be46e18bf409329cf6bc9f 100644 (file)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: fry accessors namespaces assocs deques search-deques
-kernel sequences sequences.deep words sets stack-checker.branches
-compiler.tree compiler.tree.def-use compiler.tree.combinators ;
+dlists kernel sequences sequences.deep words sets
+stack-checker.branches compiler.tree compiler.tree.def-use
+compiler.tree.combinators ;
 IN: compiler.tree.dead-code.liveness
 
 SYMBOL: work-list
index 9be9f13043fea79970f2eda4439753d3d365c6f5..705f44eeb66105c3032cfb23ef9723aa460ef6bf 100644 (file)
@@ -18,12 +18,16 @@ TUPLE: definition value node uses ;
         swap >>node
         V{ } clone >>uses ;
 
+ERROR: no-def-error value ;
+
 : def-of ( value -- definition )
-    def-use get at* [ "No def" throw ] unless ;
+    dup def-use get at* [ nip ] [ no-def-error ] if ;
+
+ERROR: multiple-defs-error ;
 
 : def-value ( node value -- )
     def-use get 2dup key? [
-        "Multiple defs" throw
+        multiple-defs-error
     ] [
         [ [ <definition> ] keep ] dip set-at
     ] if ;
index d257cd660078fd74a30d5425ed2ad94f34313e5e..2e40693e6982df2fa5961eec6d964a87a940d5eb 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel assocs arrays namespaces accessors sequences deques
-search-deques compiler.tree compiler.tree.combinators ;
+search-deques dlists compiler.tree compiler.tree.combinators ;
 IN: compiler.tree.recursive
 
 ! Collect label info
index 58f077ed1e44618eec2fd9f7f5325b686bfaf5e1..e747bd93164385ea129aeff3fa8977eb2767ba82 100644 (file)
@@ -4,7 +4,7 @@ IN: deques
 
 HELP: deque-empty?
 { $values { "deque" deque } { "?" "a boolean" } }
-{ $description "Returns true if a deque is empty." }
+{ $contract "Returns true if a deque is empty." }
 { $notes "This operation is O(1)." } ;
 
 HELP: clear-deque
@@ -12,12 +12,6 @@ HELP: clear-deque
      { "deque" deque } }
 { $description "Removes all elements from a deque." } ;
 
-HELP: deque-length
-{ $values
-     { "deque" deque }
-     { "n" integer } }
-{ $description "Returns the number of elements in a deque." } ;
-
 HELP: deque-member?
 { $values
      { "value" object } { "deque" deque }
@@ -31,7 +25,7 @@ HELP: push-front
 
 HELP: push-front*
 { $values { "obj" object } { "deque" deque } { "node" "a node" } }
-{ $description "Push the object onto the front of the deque and return the newly created node." } 
+{ $contract "Push the object onto the front of the deque and return the newly created node." } 
 { $notes "This operation is O(1)." } ;
 
 HELP: push-back
@@ -41,7 +35,7 @@ HELP: push-back
 
 HELP: push-back*
 { $values { "obj" object } { "deque" deque } { "node" "a node" } }
-{ $description "Push the object onto the back of the deque and return the newly created node." } 
+{ $contract "Push the object onto the back of the deque and return the newly created node." } 
 { $notes "This operation is O(1)." } ;
 
 HELP: push-all-back
@@ -56,7 +50,7 @@ HELP: push-all-front
 
 HELP: peek-front
 { $values { "deque" deque } { "obj" object } }
-{ $description "Returns the object at the front of the deque." } ;
+{ $contract "Returns the object at the front of the deque." } ;
 
 HELP: pop-front
 { $values { "deque" deque } { "obj" object } }
@@ -65,12 +59,12 @@ HELP: pop-front
 
 HELP: pop-front*
 { $values { "deque" deque } }
-{ $description "Pop the object off the front of the deque." }
+{ $contract "Pop the object off the front of the deque." }
 { $notes "This operation is O(1)." } ;
 
 HELP: peek-back
 { $values { "deque" deque } { "obj" object } }
-{ $description "Returns the object at the back of the deque." } ;
+{ $contract "Returns the object at the back of the deque." } ;
 
 HELP: pop-back
 { $values { "deque" deque } { "obj" object } }
@@ -79,13 +73,13 @@ HELP: pop-back
 
 HELP: pop-back*
 { $values { "deque" deque } }
-{ $description "Pop the object off the back of the deque." }
+{ $contract "Pop the object off the back of the deque." }
 { $notes "This operation is O(1)." } ;
 
 HELP: delete-node
 { $values
      { "node" object } { "deque" deque } }
-{ $description "Deletes the node from the deque." } ;
+{ $contract "Deletes the node from the deque." } ;
 
 HELP: deque
 { $description "A data structure that has constant-time insertion and removal of elements at both ends." } ;
@@ -111,7 +105,7 @@ $nl
 "Querying the deque:"
 { $subsection peek-front }
 { $subsection peek-back }
-{ $subsection deque-length }
+{ $subsection deque-empty? }
 { $subsection deque-member? }
 "Adding and removing elements:"
 { $subsection push-front* }
@@ -123,7 +117,6 @@ $nl
 { $subsection delete-node }
 { $subsection node-value }
 "Utility operations built in terms of the above:"
-{ $subsection deque-empty? }
 { $subsection push-front }
 { $subsection push-all-front }
 { $subsection push-back }
index 1d86a3f1db5ee0e6bfea219c0a5278a5e04f9967..f4e68c214b2a921b390984f43f55099032a43cd4 100644 (file)
@@ -10,13 +10,10 @@ GENERIC: peek-back ( deque -- obj )
 GENERIC: pop-front* ( deque -- )
 GENERIC: pop-back* ( deque -- )
 GENERIC: delete-node ( node deque -- )
-GENERIC: deque-length ( deque -- n )
 GENERIC: deque-member? ( value deque -- ? )
 GENERIC: clear-deque ( deque -- )
 GENERIC: node-value ( node -- value )
-
-: deque-empty? ( deque -- ? )
-    deque-length zero? ;
+GENERIC: deque-empty? ( deque -- ? )
 
 : push-front ( obj deque -- )
     push-front* drop ;
index 557010cf7c636c033fc67e505b0341051ff919d7..2ea5abf787e0000b89d934489ac5b320a8444f9a 100644 (file)
@@ -1,5 +1,5 @@
 USING: help.markup help.syntax kernel quotations
-deques ;
+deques search-deques hashtables ;
 IN: dlists
 
 ARTICLE: "dlists" "Double-linked lists"
@@ -18,10 +18,16 @@ $nl
 { $subsection dlist-contains? }
 "Deleting a node matching a predicate:"
 { $subsection delete-node-if* }
-{ $subsection delete-node-if } ;
+{ $subsection delete-node-if }
+"Search deque implementation:"
+{ $subsection <hashed-dlist> } ;
 
 ABOUT: "dlists"
 
+HELP: <hashed-dlist> ( -- search-deque )
+{ $values { "search-deque" search-deque } }
+{ $description "Creates a new " { $link search-deque } " backed by a " { $link dlist } ", with a " { $link hashtable } " for fast membership tests." } ;
+
 HELP: dlist-find
 { $values { "dlist" { $link dlist } } { "quot" quotation } { "obj/f" "an object or " { $link f } } { "?" "a boolean" } }
 { $description "Applies the quotation to each element of the " { $link dlist } " in turn, until it outputs a true value or the end of the " { $link dlist } " is reached.  Outputs either the object it found or " { $link f } ", and a boolean which is true if an object is found." }
index 92b141dca8608e1aa387315ab5c5a4cfc55ce9ee..613fe565425eeb230a10f5fa1fa8dfe1733ed69e 100644 (file)
@@ -52,15 +52,6 @@ IN: dlists.tests
 [ 1 ] [ <dlist> 1 over push-back [ 1 = ] delete-node-if ] unit-test
 [ t ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop deque-empty? ] unit-test
 [ t ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop deque-empty? ] unit-test
-[ 0 ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test
-[ 1 ] [ <dlist> 1 over push-back 2 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test
-[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test
-[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 2 = ] delete-node-if drop deque-length ] unit-test
-[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 3 = ] delete-node-if drop deque-length ] unit-test
-
-[ 0 ] [ <dlist> deque-length ] unit-test
-[ 1 ] [ <dlist> 1 over push-front deque-length ] unit-test
-[ 0 ] [ <dlist> 1 over push-front dup pop-front* deque-length ] unit-test
 
 [ t ] [ <dlist> 4 over push-back 5 over push-back [ obj>> 4 = ] dlist-find-node drop class dlist-node = ] unit-test
 [ t ] [ <dlist> 4 over push-back 5 over push-back [ obj>> 5 = ] dlist-find-node drop class dlist-node = ] unit-test
index 5072c3edfd94b8a99327cabebd19563c67b88c07..bd0e0f28cf6b5c9b06b607beff626559ae9cbd8a 100644 (file)
@@ -2,51 +2,57 @@
 ! Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: combinators kernel math sequences accessors deques
-summary ;
+search-deques summary hashtables ;
 IN: dlists
 
-TUPLE: dlist front back length ;
+<PRIVATE
 
-: <dlist> ( -- obj )
-    dlist new
-        0 >>length ;
+MIXIN: ?dlist-node
 
-M: dlist deque-length length>> ;
+INSTANCE: f ?dlist-node
 
-<PRIVATE
+TUPLE: dlist-node obj { prev ?dlist-node } { next ?dlist-node } ;
 
-TUPLE: dlist-node obj prev next ;
+INSTANCE: dlist-node ?dlist-node
 
 C: <dlist-node> dlist-node
 
-M: dlist-node node-value obj>> ;
+PRIVATE>
 
-: inc-length ( dlist -- )
-    [ 1+ ] change-length drop ; inline
+TUPLE: dlist
+{ front ?dlist-node }
+{ back ?dlist-node } ;
 
-: dec-length ( dlist -- )
-    [ 1- ] change-length drop ; inline
+: <dlist> ( -- obj )
+    dlist new ; inline
+
+: <hashed-dlist> ( -- search-deque )
+    20 <hashtable> <dlist> <search-deque> ;
+
+M: dlist deque-empty? front>> not ;
+
+M: dlist-node node-value obj>> ;
 
 : set-prev-when ( dlist-node dlist-node/f -- )
-    [ (>>prev) ] [ drop ] if* ;
+    [ (>>prev) ] [ drop ] if* ; inline
 
 : set-next-when ( dlist-node dlist-node/f -- )
-    [ (>>next) ] [ drop ] if* ;
+    [ (>>next) ] [ drop ] if* ; inline
 
 : set-next-prev ( dlist-node -- )
-    dup next>> set-prev-when ;
+    dup next>> set-prev-when ; inline
 
 : normalize-front ( dlist -- )
-    dup back>> [ f >>front ] unless drop ;
+    dup back>> [ f >>front ] unless drop ; inline
 
 : normalize-back ( dlist -- )
-    dup front>> [ f >>back ] unless drop ;
+    dup front>> [ f >>back ] unless drop ; inline
 
 : set-back-to-front ( dlist -- )
-    dup back>> [ dup front>> >>back ] unless drop ;
+    dup back>> [ dup front>> >>back ] unless drop ; inline
 
 : set-front-to-back ( dlist -- )
-    dup front>> [ dup back>> >>front ] unless drop ;
+    dup front>> [ dup back>> >>front ] unless drop ; inline
 
 : (dlist-find-node) ( dlist-node quot: ( node -- ? ) -- node/f ? )
     over [
@@ -62,22 +68,20 @@ M: dlist-node node-value obj>> ;
 
 : unlink-node ( dlist-node -- )
     dup prev>> over next>> set-prev-when
-    dup next>> swap prev>> set-next-when ;
+    dup next>> swap prev>> set-next-when ; inline
 
 PRIVATE>
 
 M: dlist push-front* ( obj dlist -- dlist-node )
     [ front>> f swap <dlist-node> dup dup set-next-prev ] keep
     [ (>>front) ] keep
-    [ set-back-to-front ] keep
-    inc-length ;
+    set-back-to-front ;
 
 M: dlist push-back* ( obj dlist -- dlist-node )
     [ back>> f <dlist-node> ] keep
     [ back>> set-next-when ] 2keep
     [ (>>back) ] 2keep
-    [ set-front-to-back ] keep
-    inc-length ;
+    set-front-to-back ;
 
 ERROR: empty-dlist ;
 
@@ -88,31 +92,27 @@ M: dlist peek-front ( dlist -- obj )
     front>> [ obj>> ] [ empty-dlist ] if* ;
 
 M: dlist pop-front* ( dlist -- )
-    dup front>> [ empty-dlist ] unless
     [
-        dup front>>
+        dup front>> [ empty-dlist ] unless*
         dup next>>
         f rot (>>next)
         f over set-prev-when
         swap (>>front)
     ] keep
-    [ normalize-back ] keep
-    dec-length ;
+    normalize-back ;
 
 M: dlist peek-back ( dlist -- obj )
     back>> [ obj>> ] [ empty-dlist ] if* ;
 
 M: dlist pop-back* ( dlist -- )
-    dup back>> [ empty-dlist ] unless
     [
-        dup back>>
+        dup back>> [ empty-dlist ] unless*
         dup prev>>
         f rot (>>prev)
         f over set-next-when
         swap (>>back)
     ] keep
-    [ normalize-front ] keep
-    dec-length ;
+    normalize-front ;
 
 : dlist-find ( dlist quot -- obj/f ? )
     [ obj>> ] prepose
@@ -128,7 +128,7 @@ M: dlist delete-node ( dlist-node dlist -- )
     {
         { [ 2dup front>> eq? ] [ nip pop-front* ] }
         { [ 2dup back>> eq? ] [ nip pop-back* ] }
-        [ dec-length unlink-node ]
+        [ drop unlink-node ]
     } cond ;
 
 : delete-node-if* ( dlist quot -- obj/f ? )
index fef770b0f877b83bcdb3d2122bceed1961041f9a..fe0ce7c1574663add50091d6e97f8d7d29f3c1c6 100644 (file)
@@ -1,21 +1,15 @@
 IN: search-deques
-USING: help.markup help.syntax kernel dlists hashtables
+USING: help.markup help.syntax kernel hashtables
 deques assocs ;
 
 ARTICLE: "search-deques" "Search deques"
 "A search deque is a data structure with constant-time insertion and removal of elements at both ends, and constant-time membership tests. Inserting an element more than once has no effect. Search deques implement all deque operations in terms of an underlying deque, and membership testing with " { $link deque-member? } " is implemented with an underlying assoc. Search deques are defined in the " { $vocab-link "search-deques" } " vocabulary."
 $nl
 "Creating a search deque:"
-{ $subsection <search-deque> }
-"Default implementation:"
-{ $subsection <hashed-dlist> } ;
+{ $subsection <search-deque> } ;
 
 ABOUT: "search-deques"
 
 HELP: <search-deque> ( assoc deque -- search-deque )
 { $values { "assoc" assoc } { "deque" deque } { "search-deque" search-deque } }
 { $description "Creates a new " { $link search-deque } "." } ;
-
-HELP: <hashed-dlist> ( -- search-deque )
-{ $values { "search-deque" search-deque } }
-{ $description "Creates a new " { $link search-deque } " backed by a " { $link dlist } ", with a " { $link hashtable } " for fast membership tests." } ;
index cf2837a84cba3fdb03f0136cb709ed5be5623f28..7c40c60f7a30931ecab4a5a045e70450dc145143 100644 (file)
@@ -1,6 +1,6 @@
 IN: search-deques.tests
 USING: search-deques tools.test namespaces
-kernel sequences words deques vocabs ;
+kernel sequences words deques vocabs dlists ;
 
 <hashed-dlist> "h" set
 
@@ -15,13 +15,11 @@ kernel sequences words deques vocabs ;
 [ t ] [ "1" get "2" get eq? ] unit-test
 [ t ] [ "2" get "3" get eq? ] unit-test
 
-[ 3 ] [ "h" get deque-length ] unit-test
 [ t ] [ 7 "h" get deque-member? ] unit-test
 
 [ 3 ] [ "1" get node-value ] unit-test
 [ ] [ "1" get "h" get delete-node ] unit-test
 
-[ 2 ] [ "h" get deque-length ] unit-test
 [ 1 ] [ "h" get pop-back ] unit-test
 [ 7 ] [ "h" get pop-back ] unit-test
 
index 8e5506090c4ee20de39d50459e3dc4bc99377f85..5546a9766dd86eb48f34ac9538b5a4bcbd286938 100644 (file)
@@ -1,16 +1,13 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors kernel assocs deques dlists hashtables ;
+USING: accessors kernel assocs deques ;
 IN: search-deques
 
 TUPLE: search-deque assoc deque ;
 
 C: <search-deque> search-deque
 
-: <hashed-dlist> ( -- search-deque )
-    0 <hashtable> <dlist> <search-deque> ;
-
-M: search-deque deque-length deque>> deque-length ;
+M: search-deque deque-empty? deque>> deque-empty? ;
 
 M: search-deque peek-front deque>> peek-front ;