]> gitweb.factorcode.org Git - factor.git/commitdiff
predicate metaclass; prettyprint, see, unparse, ' and other words are now generic
authorSlava Pestov <slava@factorcode.org>
Mon, 13 Dec 2004 04:49:44 +0000 (04:49 +0000)
committerSlava Pestov <slava@factorcode.org>
Mon, 13 Dec 2004 04:49:44 +0000 (04:49 +0000)
17 files changed:
TODO.FACTOR.txt
library/bootstrap/image.factor
library/generic.factor
library/hashtables.factor
library/strings.factor
library/syntax/prettyprint.factor
library/syntax/see.factor
library/test/compiler/generic.factor
library/test/dataflow.factor
library/test/generic.factor
library/test/lists/namespaces.factor
library/test/strings.factor
library/test/test.factor
library/test/words.factor
library/tools/debugger.factor
library/tools/interpreter.factor
library/words.factor

index d15bbf0162b68bb778f27bd094dbfc6065ce8d6b..6506c2c6b0bb3d2982af1ae27dbde5fea6968332 100644 (file)
@@ -35,8 +35,7 @@
 \r
 + listener/plugin:\r
 \r
-- unterminated ; -- NPE\r
-- no USE:'s wrong place\r
+- sidekick: still parsing too much\r
 - errors don't always disappear\r
 - console: wrong history\r
 - listener: if too many things popped off the stack, complain\r
index dd3a5730fd499949113962bd77a72ac4b022f7a3..4d0afde88cd0cf36a0ef2f348dab7bd3bbd3d762 100644 (file)
@@ -40,6 +40,7 @@
 
 IN: image
 USE: errors
+USE: generic
 USE: hashtables
 USE: kernel
 USE: lists
@@ -128,6 +129,9 @@ SYMBOL: boot-quot
 : heap-size-offset 5 ;
 : header-size      6 ;
 
+GENERIC: ' ( obj -- ptr )
+#! Write an object to the image.
+
 ( Allocator )
 
 : here ( -- size ) 
@@ -149,11 +153,11 @@ SYMBOL: boot-quot
 
 ( Fixnums )
 
-: emit-fixnum ( n -- tagged ) fixnum-tag immediate ;
+M: fixnum ' ( n -- tagged ) fixnum-tag immediate ;
 
 ( Bignums )
 
-: emit-bignum ( bignum -- tagged )
+M: bignum ' ( bignum -- tagged )
     #! This can only emit 0, -1 and 1.
     object-tag here-as >r
     bignum-type >header emit
@@ -170,11 +174,16 @@ SYMBOL: boot-quot
 : t,
     object-tag here-as "t" set
     t-type >header emit
-    0 emit-fixnum emit ;
+    0 ' emit ;
+
+M: t ' ( obj -- ptr ) drop "t" get ;
+M: f ' ( obj -- ptr )
+    #! f is #define F RETAG(0,OBJECT_TYPE)
+    drop object-tag ;
 
-:  0,  0 emit-bignum drop ;
-:  1,  1 emit-bignum drop ;
-: -1, -1 emit-bignum drop ;
+:  0,  0 >bignum ' drop ;
+:  1,  1 >bignum ' drop ;
+: -1, -1 >bignum ' drop ;
 
 ( Beginning of the image )
 ! The image proper begins with the header, then T,
@@ -209,14 +218,12 @@ SYMBOL: boot-quot
         dup word? [ fixup-word ] when
     ] vector-map image set ;
 
-: emit-word ( word -- pointer )
+M: word ' ( word -- pointer )
     dup pooled-object dup [ nip ] [ drop ] ifte ;
 
 ( Conses )
 
-DEFER: '
-
-: emit-cons ( c -- tagged )
+M: cons ' ( c -- tagged )
     uncons ' swap '
     cons-tag here-as
     -rot emit emit ;
@@ -239,7 +246,7 @@ DEFER: '
 : pack-string ( string -- )
     char tuck swap split-n (pack-string) ;
 
-: (emit-string) ( string -- )
+: emit-string ( string -- )
     object-tag here-as swap
     string-type >header emit
     dup str-length emit
@@ -247,13 +254,13 @@ DEFER: '
     pack-string
     pad ;
 
-: emit-string ( string -- pointer )
+M: string ' ( string -- pointer )
     #! We pool strings so that each string is only written once
     #! to the image
     dup pooled-object dup [
         nip
     ] [
-        drop dup (emit-string) dup >r pool-object r>
+        drop dup emit-string dup >r pool-object r>
     ] ifte ;
 
 ( Word definitions )
@@ -300,7 +307,7 @@ DEFER: '
     ( elements -- ) [ emit ] each
     pad r> ;
 
-: emit-vector ( vector -- pointer )
+M: vector ' ( vector -- pointer )
     dup vector>list emit-array swap vector-length
     object-tag here-as >r
     vector-type >header emit
@@ -308,22 +315,6 @@ DEFER: '
     emit ( array ptr )
     pad r> ;
 
-( Cross-compile a reference to an object )
-
-: ' ( obj -- pointer )
-    [
-        [ fixnum?  ] [ emit-fixnum      ]
-        [ bignum?  ] [ emit-bignum      ]
-        [ word?    ] [ emit-word        ]
-        [ cons?    ] [ emit-cons        ]
-        [ string?  ] [ emit-string      ]
-        [ vector?  ] [ emit-vector      ]
-        [ t =      ] [ drop "t" get     ]
-        ! f is #define F RETAG(0,OBJECT_TYPE)
-        [ f =      ] [ drop object-tag  ]
-        [ drop t   ] [ "Cannot cross-compile: " swap cat2 throw ]
-    ] cond ;
-
 ( End of the image )
 
 : vocabularies, ( -- )
index fd4c7d8a84388a6f9ef145d3389b9309b6abd6c9..5d2620bcf59139f67c379e537ecb8b5b17a57284 100644 (file)
@@ -35,9 +35,34 @@ USE: parser
 USE: strings
 USE: words
 USE: vectors
+USE: math
 
 ! A simple single-dispatch generic word system.
 
+: predicate-word ( word -- word )
+    word-name "?" cat2 "in" get create ;
+
+! Terminology:
+! - type: a datatype built in to the runtime, eg fixnum, word
+! cons. All objects have exactly one type, new types cannot be
+! defined, and types are disjoint.
+! - class: a user defined way of differentiating objects, either
+! based on type, or some combination of type, predicate, or
+! method map.
+! - traits: a hashtable has traits of its traits slot is set to
+! a hashtable mapping selector names to method definitions.
+! The class of an object with traits is determined by the object
+! identity of the traits method map.
+! - metaclass: a metaclass is a symbol with a handful of word
+! properties: "define-method" "builtin-types"
+
+: metaclass ( class -- metaclass )
+    "metaclass" word-property ;
+
+: builtin-supertypes ( class -- list )
+    #! A list of builtin supertypes of the class.
+    dup metaclass "builtin-supertypes" word-property call ;
+
 ! Catch-all metaclass for providing a default method.
 SYMBOL: object
 
@@ -51,24 +76,41 @@ SYMBOL: object
 : define-object ( generic definition -- )
     <vtable> define-generic drop ;
 
-object [ define-object ] "define-method" set-word-property
+object object "metaclass" set-word-property
 
-: predicate-word ( word -- word )
-    word-name "?" cat2 "in" get create ;
+object [
+    define-object
+] "define-method" set-word-property
 
-: builtin-predicate ( type# symbol -- )
-    predicate-word swap [ swap type eq? ] cons define-compound ;
+object [
+    drop num-types count
+] "builtin-supertypes" set-word-property
+
+! Builtin metaclass for builtin types: fixnum, word, cons, etc.
+SYMBOL: builtin
 
 : add-method ( definition type vtable -- )
     >r "builtin-type" word-property r> set-vector-nth ;
 
-: define-builtin ( type generic definition -- )
+: builtin-method ( type generic definition -- )
     -rot "vtable" word-property add-method ;
 
+builtin [ builtin-method ] "define-method" set-word-property
+
+builtin [
+    "builtin-type" word-property unit
+] "builtin-supertypes" set-word-property
+
+: builtin-predicate ( type# symbol -- word )
+    predicate-word [
+        swap [ swap type eq? ] cons define-compound
+    ] keep ;
+
 : builtin-class ( number type -- )
     dup undefined? [ dup define-symbol ] when
     2dup builtin-predicate
-    dup [ define-builtin ] "define-method" set-word-property
+    dupd "predicate" set-word-property
+    dup builtin "metaclass" set-word-property
     swap "builtin-type" set-word-property ;
 
 : BUILTIN:
@@ -79,19 +121,73 @@ object [ define-object ] "define-method" set-word-property
 : builtin-type ( symbol -- n )
     "builtin-type" word-property ;
 
+! Predicate metaclass for generalized predicate dispatch.
+SYMBOL: predicate
+
+: predicate-dispatch ( class definition existing -- dispatch )
+    [
+        \ dup ,
+        rot "predicate" word-property ,
+        swap , , \ ifte ,
+    ] make-list ;
+
+: (predicate-method) ( class generic definition type# -- )
+    rot "vtable" word-property
+    [ vector-nth predicate-dispatch ] 2keep
+    set-vector-nth ;
+
+: predicate-method ( class generic definition -- )
+    pick builtin-supertypes [
+        >r 3dup r> (predicate-method)
+    ] each 3drop ;
+
+predicate [
+    predicate-method
+] "define-method" set-word-property
+
+predicate [
+    "superclass" word-property builtin-supertypes
+] "builtin-supertypes" set-word-property
+
+: define-predicate ( class predicate definition -- )
+    rot "superclass" word-property "predicate" word-property
+    [ \ dup , , , [ drop f ] , \ ifte , ] make-list
+    define-compound ;
+
+: PREDICATE: ( -- class predicate definition )
+    #! Followed by a superclass name, then a class name.
+    scan-word
+    CREATE
+    dup rot "superclass" set-word-property
+    dup predicate "metaclass" set-word-property
+    dup predicate-word
+    [ dupd "predicate" set-word-property ] keep
+    [ define-predicate ] [ ] ; parsing
+
+! Traits metaclass for user-defined classes based on hashtables
+
 ! Hashtable slot holding a selector->method map.
 SYMBOL: traits
 
+: traits-map ( class -- hash )
+    #! The method map word property maps selector words to
+    #! definitions.
+    "traits-map" word-property ;
+
+: traits-method ( class generic definition -- )
+    swap rot traits-map set-hash ;
+
+traits [ traits-method ] "define-method" set-word-property
+
+traits [
+    \ vector "builtin-type" word-property unique,
+] "builtin-supertypes" set-word-property
+
 ! Hashtable slot holding an optional delegate. Any undefined
 ! methods are called on the delegate. The object can also
 ! manually pass any methods on to the delegate.
 SYMBOL: delegate
 
-: traits-map ( type -- hash )
-    #! The method map word property maps selector words to
-    #! definitions.
-    "traits-map" word-property ;
-
 : object-map ( obj -- hash )
     #! Get the method map for an object.
     #! We will use hashtable? here when its a first-class type.
@@ -103,7 +199,7 @@ SYMBOL: delegate
 : undefined-method
     "No applicable method." throw ;
 
-: traits-method ( selector traits -- traits quot )
+: traits-dispatch ( selector traits -- traits quot )
     #! Look up the method with the traits object on the stack.
     #! Returns the traits to call the method on; either the
     #! original object, or one of the delegates.
@@ -111,7 +207,7 @@ SYMBOL: delegate
         rot drop cdr ( method is defined )
     ] [
         drop delegate swap hash* dup [
-            cdr traits-method ( check delegate )
+            cdr traits-dispatch ( check delegate )
         ] [
             drop [ undefined-method ] ( no delegate )
         ] ifte
@@ -124,30 +220,19 @@ SYMBOL: delegate
     traits-map [ swap object-map eq? ] cons
     define-compound ;
 
-: define-traits ( type generic definition -- )
-    swap rot traits-map set-hash ;
-
 : TRAITS:
     #! TRAITS: foo creates a new traits type. Instances can be
     #! created with <foo>, and tested with foo?.
     CREATE
     dup define-symbol
     dup init-traits-map
-    dup [ define-traits ] "define-method" set-word-property
+    dup traits "metaclass" set-word-property
     traits-predicate ; parsing
 
 : add-traits-dispatch ( word vtable -- )
-    >r unit [ car swap traits-method call ] cons \ vector r>
+    >r unit [ car swap traits-dispatch call ] cons \ vector r>
     add-method ;
 
-: GENERIC:
-    #! GENERIC: bar creates a generic word bar that calls the
-    #! bar method on the traits object, with the traits object
-    #! on the stack.
-    CREATE [ undefined-method ] <vtable>
-    2dup add-traits-dispatch
-    define-generic ; parsing
-
 : constructor-word ( word -- word )
     word-name "<" swap ">" cat3 "in" get create ;
 
@@ -162,14 +247,24 @@ SYMBOL: delegate
     scan-word [ constructor-word ] keep
     [ define-constructor ] [ ] ; parsing
 
-: define-method ( type -- quotation )
+! Defining generic words
+
+: GENERIC:
+    #! GENERIC: bar creates a generic word bar that calls the
+    #! bar method on the traits object, with the traits object
+    #! on the stack.
+    CREATE [ undefined-method ] <vtable>
+    2dup add-traits-dispatch
+    define-generic ; parsing
+
+: define-method ( class -- quotation )
     #! In a vain attempt at something resembling a "meta object
     #! protocol", we call the "define-method" word property with
-    #! stack ( type generic definition -- ).
-    "define-method" word-property
+    #! stack ( class generic definition -- ).
+    metaclass "define-method" word-property
     [ [ undefined-method ] ] unless* ;
 
-: M: ( -- type generic [ ] )
+: M: ( -- class generic [ ] )
     #! M: foo bar begins a definition of the bar generic word
     #! specialized to the foo type.
     scan-word  dup define-method  scan-word swap [ ] ; parsing
index 34a6690a75ecd783e7bfa86022715b73afd7ba80..63238063be65b1032aabd260c7d6ac0fba8fccb1 100644 (file)
@@ -26,6 +26,7 @@
 ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 IN: hashtables
+USE: generic
 USE: kernel
 USE: lists
 USE: math
@@ -35,8 +36,8 @@ USE: vectors
 ! for the lifetime of the hashtable, otherwise problems will
 ! occur. Do not use vector words with hashtables.
 
-: hashtable? ( obj -- ? )
-    dup vector? [ [ assoc? ] vector-all? ] [ drop f ] ifte ;
+PREDICATE: vector hashtable ( obj -- ? )
+    [ assoc? ] vector-all? ;
 
 : <hashtable> ( buckets -- )
     #! A hashtable is implemented as an array of buckets. The
index 5b55ff9d08d6e8bf5c23679f904afb1f20f898d2..683f3630ea24fbf004e03262fb17226bb045b44e 100644 (file)
@@ -91,7 +91,7 @@ USE: math
 
 : =? ( x y z -- z/f )
     #! Push z if x = y, otherwise f.
-    -rot = [ drop f ] unless ;
+    >r = r> f ? ;
 
 : str-head? ( str begin -- str )
     #! If the string starts with begin, return the rest of the
index 9ab7e29f774f8b23ebbe57824aaddb643ba1b30f..d93117058f2d9310e7a9a12513782ab235eee771 100644 (file)
@@ -28,6 +28,7 @@
 IN: prettyprint
 USE: errors
 USE: format
+USE: generic
 USE: kernel
 USE: lists
 USE: math
@@ -40,6 +41,11 @@ USE: vectors
 USE: words
 USE: hashtables
 
+GENERIC: prettyprint* ( indent obj -- indent )
+
+M: object prettyprint* ( indent obj -- indent )
+    unparse write ;
+
 : tab-size
     #! Change this to suit your tastes.
     4 ;
@@ -58,11 +64,12 @@ USE: hashtables
 : prettyprint-space ( -- )
     " " write ;
 
-! Real definition follows
-DEFER: prettyprint*
-
 : prettyprint-element ( indent obj -- indent )
-    prettyprint* prettyprint-space ;
+    over prettyprint-limit >= [
+        unparse write
+    ] [
+        prettyprint*
+    ] ifte prettyprint-space ;
 
 : <prettyprint ( indent -- indent )
     tab-size +
@@ -107,16 +114,16 @@ DEFER: prettyprint*
         drop [ ]
     ] ifte ;
 
-: prettyprint-word ( word -- )
+M: word prettyprint* ( indent word -- indent )
     dup word-name
     swap dup word-attrs swap word-style append
     write-attr ;
 
 : prettyprint-[ ( indent -- indent )
-    \ [ prettyprint-word <prettyprint ;
+    \ [ prettyprint* <prettyprint ;
 
 : prettyprint-] ( indent -- indent )
-    prettyprint> \ ] prettyprint-word ;
+    prettyprint> \ ] prettyprint* ;
 
 : prettyprint-list ( indent list -- indent )
     #! Pretty-print a list, without [ and ].
@@ -126,70 +133,56 @@ DEFER: prettyprint*
             prettyprint-list
         ] [
             [
-                \ | prettyprint-word
+                \ | prettyprint*
                 prettyprint-space prettyprint-element
             ] when*
         ] ifte
     ] when* ;
 
-: prettyprint-[] ( indent list -- indent )
+M: cons prettyprint* ( indent list -- indent )
     swap prettyprint-[ swap prettyprint-list prettyprint-] ;
 
 : prettyprint-{ ( indent -- indent )
-    \ { prettyprint-word <prettyprint ;
+    \ { prettyprint* <prettyprint ;
 
 : prettyprint-} ( indent -- indent )
-    prettyprint> \ } prettyprint-word ;
+    prettyprint> \ } prettyprint* ;
 
 : prettyprint-vector ( indent list -- indent )
     #! Pretty-print a vector, without { and }.
     [ prettyprint-element ] vector-each ;
 
-: prettyprint-{} ( indent vector -- indent )
+M: vector prettyprint* ( indent vector -- indent )
     dup vector-length 0 = [
         drop
-        \ { prettyprint-word
+        \ { prettyprint*
         prettyprint-space
-        \ } prettyprint-word
+        \ } prettyprint*
     ] [
         swap prettyprint-{ swap prettyprint-vector prettyprint-}
     ] ifte ;
 
 : prettyprint-{{ ( indent -- indent )
-    \ {{ prettyprint-word <prettyprint ;
+    \ {{ prettyprint* <prettyprint ;
 
 : prettyprint-}} ( indent -- indent )
-    prettyprint> \ }} prettyprint-word ;
+    prettyprint> \ }} prettyprint* ;
 
-: prettyprint-{{}} ( indent hashtable -- indent )
+M: hashtable prettyprint* ( indent hashtable -- indent )
     hash>alist dup length 0 = [
         drop
-        \ {{ prettyprint-word
+        \ {{ prettyprint*
         prettyprint-space 
-        \ }} prettyprint-word
+        \ }} prettyprint*
     ] [
         swap prettyprint-{{ swap prettyprint-list prettyprint-}}
     ] ifte ;
 
-: prettyprint-object ( indent obj -- indent )
-    unparse write ;
-
-: prettyprint* ( indent obj -- indent )
-    over prettyprint-limit >= [
-        prettyprint-object
-    ] [
-        [
-            [ f =        ] [ prettyprint-object ]
-            [ cons?      ] [ prettyprint-[] ]
-            [ hashtable? ] [ prettyprint-{{}} ]
-            [ vector?    ] [ prettyprint-{} ]
-            [ word?      ] [ prettyprint-word ]
-            [ drop t     ] [ prettyprint-object ]
-        ] cond
-    ] ifte ;
+: prettyprint-1 ( obj -- )
+    0 swap prettyprint* drop ;
 
 : prettyprint ( obj -- )
-    0 swap prettyprint* drop terpri ;
+    prettyprint-1 terpri ;
 
 : vocab-link ( vocab -- link )
     "vocabularies'" swap cat2 ;
index f97cf973d67de81e58e339aa0636d1f8f817c46a..fde6db2df03af18dad216bbd935c933ed0e93137 100644 (file)
@@ -26,6 +26,7 @@
 ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 IN: prettyprint
+USE: generic
 USE: kernel
 USE: lists
 USE: math
@@ -43,20 +44,20 @@ USE: words
     dup vocab-attrs write-attr ;
 
 : prettyprint-IN: ( indent word -- )
-    \ IN: prettyprint-word prettyprint-space
+    \ IN: prettyprint* prettyprint-space
     word-vocabulary prettyprint-vocab prettyprint-newline ;
 
 : prettyprint-: ( indent -- indent )
-    \ : prettyprint-word prettyprint-space
+    \ : prettyprint* prettyprint-space
     tab-size + ;
 
 : prettyprint-; ( indent -- indent )
-    \ ; prettyprint-word
+    \ ; prettyprint*
     tab-size - ;
 
 : prettyprint-prop ( word prop -- )
     tuck word-name word-property [
-        prettyprint-space prettyprint-word
+        prettyprint-space prettyprint-1
     ] [
         drop
     ] ifte ;
@@ -88,29 +89,25 @@ USE: words
         stack-effect. dup prettyprint-newline
     ] keep documentation. ;
 
-: see-compound ( word -- )
+GENERIC: see ( word -- )
+
+M: object see ( obj -- )
+    "Not a word: " write . ;
+
+M: compound see ( word -- )
     0 swap
     [ dupd prettyprint-IN: prettyprint-: ] keep
-    [ prettyprint-word ] keep
+    [ prettyprint-1 ] keep
     [ prettyprint-docs ] keep
     [ word-parameter prettyprint-list prettyprint-; ] keep
     prettyprint-plist prettyprint-newline ;
 
-: see-primitive ( word -- )
+M: primitive see ( word -- )
     "PRIMITIVE: " write dup unparse write stack-effect. terpri ;
 
-: see-symbol ( word -- )
-    \ SYMBOL: prettyprint-word prettyprint-space . ;
+M: symbol see ( word -- )
+    0 over prettyprint-IN:
+    \ SYMBOL: prettyprint-1 prettyprint-space . ;
 
-: see-undefined ( word -- )
+M: undefined see ( word -- )
     drop "Not defined" print ;
-
-: see ( name -- )
-    #! Show a word definition.
-    [
-        [ compound? ] [ see-compound ]
-        [ symbol? ] [ see-symbol ]
-        [ primitive? ] [ see-primitive ]
-        [ word? ] [ see-undefined ]
-        [ drop t ] [ "Not a word: " write . ]
-    ] cond ;
index ba99f779c5de10aec25e1f69e33fa7168228238e..9a91e8420996df37c139f32e8fce825f91d61efe 100644 (file)
@@ -7,23 +7,23 @@ USE: words
 
 : generic-test
     {
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        nip
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ nip  ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
     } generic ; compiled
 
 [ 2 3 ] [ 2 3 t generic-test ] unit-test
@@ -32,46 +32,46 @@ USE: words
 
 : generic-literal-test
     4 {
-        drop
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
-        nip
+        [ drop ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
+        [ nip  ]
     } generic ; compiled
 
 [ ] [ generic-literal-test ] unit-test
 
 : generic-test-alt
     {
-        drop
-        drop
-        drop
-        drop
-        nip
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
-        drop
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ nip  ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
+        [ drop ]
     } generic + ; compiled
 
 [ 5 ] [ 2 3 4 generic-test-alt ] unit-test
@@ -87,23 +87,23 @@ DEFER: generic-test-2
 
 : generic-test-2
     {
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-4
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
-        generic-test-3
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-4 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
+        [ generic-test-3 ]
     } generic ;
 
 [ 3 ] [ t generic-test-2 ] unit-test
index c6d1caa4814d6a356d56b6b698490589a065b2f3..143e24122266d32922c0859e1e8faa57696fb4cf 100644 (file)
@@ -62,7 +62,7 @@ USE: generic
 ] unit-test
 
 [ t ] [
-    [ { drop undefined-method drop undefined-method } generic ] dataflow
+    [ { [ drop ] [ undefined-method ] [ drop ] [ undefined-method ] } generic ] dataflow
     #generic swap dataflow-contains-op? car [
         node-param get [
             [ [ node-param get \ undefined-method = ] bind ] some?
index 801035b794e3c87cad9bd4e44d71c468aca1e1ee..012f2bf3e3768997b3535dd4d0ca4579e31dc8d8 100644 (file)
@@ -90,3 +90,13 @@ M: f bool>str drop "false" ;
 
 [ t ] [ t bool>str str>bool ] unit-test
 [ f ] [ f bool>str str>bool ] unit-test
+
+PREDICATE: cons nonempty-list list? ;
+
+GENERIC: funny-length
+M: cons funny-length drop 0 ;
+M: nonempty-list funny-length length ;
+
+[ 0 ] [ [ 1 2 | 3 ] funny-length ] unit-test
+[ 3 ] [ [ 1 2 3 ] funny-length ] unit-test
+[ "hello" funny-length ] unit-test-fails
index eedc2df07ac7f2f205d7e9d2adfd6edffb79a8d4..e539095b9f3501991488b6610fad993e8c570b1f 100644 (file)
@@ -8,7 +8,7 @@ USE: test
 [ [ 1 2 ] ] [ 1 [ 2 ] ] [ "x" set "x" cons@ "x" get ] test-word
 
 [ [ [ 2 | 3 ] [ 1 | 2 ] ] ] [
-    "x" off 2 1 "x" acons@ 3 2 "x" acons@ "x" get
+    "x" off 2 1 "x" [ acons ] change 3 2 "x" [ acons ] change "x" get
 ] unit-test
 
 [ [ 5 4 3 1 ] ] [
index 6d4664110fb76e370d54f534615453af62c72350..602351a11b65d0c04be83bee5acb9597395c36a7 100644 (file)
@@ -6,6 +6,9 @@ USE: namespaces
 USE: strings
 USE: test
 
+[ f ] [ "a" "b" "c" =? ] unit-test
+[ "c" ] [ "a" "a" "c" =? ] unit-test
+
 [ f ] [ "A string." f-or-"" ] unit-test
 [ t ] [ "" f-or-"" ] unit-test
 [ t ] [ f f-or-"" ] unit-test
index 3a59d823a610f6d3f0a08099fec3e0ea25593bc8..480aaaa60184d0db798b035c92cfea478cbae8e8 100644 (file)
@@ -100,7 +100,6 @@ USE: unparser
         "math/float"
         "math/complex"
         "math/irrational"
-        "math/namespaces"
         "httpd/url-encoding"
         "httpd/html"
         "httpd/httpd"
index 675277054c2649a3ad562141fa62c20eb5f7d450..783b571b23563542bd4372ba6e77d9c0336cce68 100644 (file)
@@ -55,3 +55,12 @@ word word-name "last-word-test" set
 [ t ] [ vocabs [ words [ word? ] all? ] all? ] unit-test
 
 [ f ] [ gensym gensym = ] unit-test
+
+[ f ] [ 123 compound? ] unit-test
+
+: colon-def ;
+[ t ] [ \ colon-def compound? ] unit-test
+
+SYMBOL: a-symbol
+[ f ] [ \ a-symbol compound? ] unit-test
+[ t ] [ \ a-symbol symbol? ] unit-test
index 3597e15a561c60158c29106cecf74f5ec3a5afac..66846fc2aee40bf6ae7eca4464f5c698c3696af5 100644 (file)
@@ -156,9 +156,9 @@ USE: math
     [
         in-parser? [ parse-dump ] [ standard-dump ] ifte
 
-        [ :s :r :n :c ] [ prettyprint-word " " write ] each
+        [ :s :r :n :c ] [ prettyprint-1 " " write ] each
         "show stacks at time of error." print
-        \ :get prettyprint-word
+        \ :get prettyprint-1
         " ( var -- value ) inspects the error namestack." print
     ] [
         flush-error-handler
index b7e1b7ba544176d58b94ed22f1c9c9f94cf0ad89..541598e89af60a3d90986c540afb407c1dbcc98e 100644 (file)
@@ -187,14 +187,14 @@ SYMBOL: meta-cf
 
 : walk-banner ( -- )
     "The following words control the single-stepper:" print
-    [ &s &r &n &c ] [ prettyprint-word " " write ] each
+    [ &s &r &n &c ] [ prettyprint-1 " " write ] each
     "show stepper stacks." print
-    \ &get prettyprint-word
+    \ &get prettyprint-1
     " ( var -- value ) inspects the stepper namestack." print
-    \ step prettyprint-word " -- single step" print
-    \ (trace) prettyprint-word " -- trace until end" print
-    \ (run) prettyprint-word " -- run until end" print
-    \ exit prettyprint-word " -- exit single-stepper" print ;
+    \ step prettyprint-1 " -- single step" print
+    \ (trace) prettyprint-1 " -- trace until end" print
+    \ (run) prettyprint-1 " -- run until end" print
+    \ exit prettyprint-1 " -- exit single-stepper" print ;
 
 : walk ( quot -- )
     #! Single-step through execution of a quotation.
index 337d373bcd87a7ba779dded819e6448846d4b8eb..f834a23f64044f0fb32aa010b77a6d67fd7f820f 100644 (file)
@@ -26,6 +26,7 @@
 ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 IN: words
+USE: generic
 USE: hashtables
 USE: kernel
 USE: lists
@@ -41,13 +42,10 @@ USE: strings
     pick [ set-assoc ] [ remove-assoc nip ] ifte
     swap set-word-plist ;
 
-: ?word-primitive ( obj -- prim/0 )
-    dup word? [ word-primitive ] [ drop -1 ] ifte ;
-
-: compound?  ( obj -- ? ) ?word-primitive 1 = ;
-: primitive? ( obj -- ? ) ?word-primitive 2 > ;
-: symbol?    ( obj -- ? ) ?word-primitive 2 = ;
-: undefined? ( obj -- ? ) ?word-primitive 0 = ;
+PREDICATE: word compound  ( obj -- ? ) word-primitive 1 = ;
+PREDICATE: word primitive ( obj -- ? ) word-primitive 2 > ;
+PREDICATE: word symbol    ( obj -- ? ) word-primitive 2 = ;
+PREDICATE: word undefined ( obj -- ? ) word-primitive 0 = ;
 
 : word ( -- word ) global [ "last-word" get ] bind ;
 : set-word ( word -- ) global [ "last-word" set ] bind ;