]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/lists/lists.factor
basis: use lint.vocabs tool to trim using lists
[factor.git] / basis / lists / lists.factor
index 29181a9da43b3770ea5333c5139b8392376f2a01..be50f8eeedff8e07dbee6b7fa64cb371a739753c 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 James Cash, Daniel Ehrenberg, Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators.short-circuit kernel locals math
-sequences ;
+USING: accessors combinators combinators.short-circuit kernel
+lexer make math namespaces parser sequences words ;
 IN: lists
 
 ! List Protocol
@@ -14,9 +14,9 @@ TUPLE: cons-state { car read-only } { cdr read-only } ;
 
 C: cons cons-state
 
-M: cons-state car ( cons -- car ) car>> ;
+M: cons-state car car>> ;
 
-M: cons-state cdr ( cons -- cdr ) cdr>> ;
+M: cons-state cdr cdr>> ;
 
 SINGLETON: +nil+
 M: +nil+ nil? drop t ;
@@ -42,9 +42,9 @@ M: object nil? drop f ;
 
 : cadr ( list -- elt ) cdr car ; inline
 
-: 2car ( list -- car cadr ) [ car ] [ cadr ] bi ; inline
+: 2car ( list -- car cadr ) uncons car ; inline
 
-: 3car ( list -- car cadr caddr ) [ car ] [ cadr ] [ cdr cadr ] tri ; inline
+: 3car ( list -- car cadr caddr ) uncons uncons car ; inline
 
 : lnth ( n list -- elt ) swap [ cdr ] times car ; inline
 
@@ -53,16 +53,30 @@ M: object nil? drop f ;
 : (leach) ( list quot -- cdr quot )
     [ [ car ] dip call ] [ [ cdr ] dip ] 2bi ; inline
 
+: (2leach) ( list1 list2 quot -- cdr1 cdr2 quot )
+    [ [ [ car ] bi@ ] dip call ] [ [ [ cdr ] bi@ ] dip ] 3bi ; inline
+
 PRIVATE>
 
 : leach ( ... list quot: ( ... elt -- ... ) -- ... )
     over nil? [ 2drop ] [ (leach) leach ] if ; inline recursive
 
+: 2leach ( ... list1 list2 quot: ( ... elt1 elt2 -- ... ) -- ... )
+    2over [ nil? ] either? [ 3drop ] [ (2leach) 2leach ] if ; inline recursive
+
+: lreduce ( ... list identity quot: ( ... prev elt -- ... next ) -- ... result )
+    swapd leach ; inline
+
+: 2lreduce ( ... list1 list2 identity quot: ( ... prev elt1 elt2 -- ... next ) -- ... result )
+    -rotd 2leach ; inline
+
 : foldl ( ... list identity quot: ( ... prev elt -- ... next ) -- ... result )
     swapd leach ; inline
 
 :: foldr ( ... list identity quot: ( ... prev elt -- ... next ) -- ... result )
-    list nil? [ identity ] [
+    list nil? [
+        identity
+    ] [
         list cdr identity quot foldr
         list car quot call
     ] if ; inline recursive
@@ -80,9 +94,7 @@ PRIVATE>
     [ lreverse ] dip [ swons ] foldl ;
 
 : lcut ( list index -- before after )
-    [ nil ] dip
-    [ [ unswons ] dip cons ] times
-    lreverse swap ;
+    [ nil ] dip [ [ unswons ] dip cons ] times lreverse swap ;
 
 : sequence>list ( sequence -- list )
     <reversed> nil [ swons ] reduce ;
@@ -102,3 +114,36 @@ INSTANCE: +nil+ list
 GENERIC: >list ( object -- list )
 
 M: list >list ;
+
+M: sequence >list sequence>list ;
+
+ERROR: list-syntax-error ;
+
+<PRIVATE
+
+: items>list ( sequence -- list )
+    [ +nil+ ] [
+        <reversed> unclip-slice [ swons ] reduce
+    ] if-empty ;
+
+: ?list-syntax-error ( right-of-dot? -- )
+    building get empty? or [ list-syntax-error ] when ;
+
+: (parse-list-literal) ( right-of-dot? -- )
+    scan-token {
+        { "}" [ drop +nil+ , ] }
+        { "." [ ?list-syntax-error t (parse-list-literal) ] }
+        [
+            parse-datum dup parsing-word? [
+                V{ } clone swap execute-parsing first
+            ] when
+            , [ "}" expect ] [ f (parse-list-literal) ] if
+        ]
+    } case ;
+
+: parse-list-literal ( -- list )
+    [ f (parse-list-literal) ] { } make items>list ;
+
+PRIVATE>
+
+SYNTAX: L{ parse-list-literal suffix! ;