From 1bcac7490681bf58e1e708a8d01abd23d5a4ee60 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 9 Mar 2005 03:54:59 +0000 Subject: [PATCH] working on layouts; simpler tuple delegation --- library/bootstrap/init-stage2.factor | 2 +- library/errors.factor | 6 +- library/generic/generic.factor | 2 +- library/generic/slots.factor | 19 ---- library/generic/tuple.factor | 43 ++++++--- library/httpd/html.factor | 4 +- library/inference/inference.factor | 12 +-- library/inference/ties.factor | 2 +- library/inference/words.factor | 4 +- library/io/ansi.factor | 5 +- library/io/network.factor | 4 +- library/io/stdio.factor | 11 +-- library/io/stream.factor | 4 +- library/io/win32-io-internals.factor | 2 +- library/io/win32-server.factor | 4 +- library/test/dataflow.factor | 4 +- library/test/gadgets.factor | 18 +--- library/test/generic.factor | 2 +- library/test/inference.factor | 8 ++ library/test/tuple.factor | 8 +- library/tools/debugger.factor | 6 +- library/tools/jedit-wire.factor | 4 +- library/ui/checkboxes.factor | 4 +- library/ui/dialogs.factor | 6 +- library/ui/editors.factor | 7 +- library/ui/ellipses.factor | 8 +- library/ui/gadgets.factor | 9 +- library/ui/hand.factor | 7 +- library/ui/labels.factor | 11 +-- library/ui/layouts.factor | 135 ++++++++++++++++----------- library/ui/menus.factor | 6 +- library/ui/panes.factor | 8 +- library/ui/rectangles.factor | 16 ++-- library/ui/scrolling.factor | 29 +++--- library/ui/shapes.factor | 24 +---- library/ui/tiles.factor | 42 +++++---- library/ui/world.factor | 4 +- 37 files changed, 239 insertions(+), 251 deletions(-) diff --git a/library/bootstrap/init-stage2.factor b/library/bootstrap/init-stage2.factor index accfbb4182..1e750b5f57 100644 --- a/library/bootstrap/init-stage2.factor +++ b/library/bootstrap/init-stage2.factor @@ -14,7 +14,7 @@ words ; init-random default-cli-args parse-command-line - "null-stdio" get [ << null-stream >> stdio set ] when ; + "null-stdio" get [ << null-stream f >> stdio set ] when ; : shell ( str -- ) #! This handles the -shell: cli argument. diff --git a/library/errors.factor b/library/errors.factor index 2f9964b62d..39b1f32005 100644 --- a/library/errors.factor +++ b/library/errors.factor @@ -5,12 +5,12 @@ IN: streams DEFER: line-number IN: parser DEFER: file IN: errors USING: kernel-internals lists namespaces streams ; -TUPLE: undefined-method object generic ; +TUPLE: no-method object generic ; -: undefined-method ( object generic -- ) +: no-method ( object generic -- ) #! We 2dup here to leave both values on the stack, for #! post-mortem inspection. - 2dup throw ; + 2dup throw ; ! This is a very lightweight exception handling system. diff --git a/library/generic/generic.factor b/library/generic/generic.factor index c4529a0eb8..5e428ce1cc 100644 --- a/library/generic/generic.factor +++ b/library/generic/generic.factor @@ -54,7 +54,7 @@ namespaces parser strings words vectors math math-internals ; : ( generic -- vtable ) unit num-types - [ drop dup [ car undefined-method ] cons ] vector-project + [ drop dup [ car no-method ] cons ] vector-project nip ; : ( generic -- vtable ) diff --git a/library/generic/slots.factor b/library/generic/slots.factor index 1fe0454c4f..02135d3130 100644 --- a/library/generic/slots.factor +++ b/library/generic/slots.factor @@ -7,12 +7,6 @@ IN: generic USING: kernel kernel-internals lists math namespaces parser strings words ; -! So far, only tuples can have delegates, which also must be -! tuples (the UI uses numbers as delegates in a couple of places -! but this is Unsupported(tm)). -GENERIC: delegate -M: object delegate drop f ; - : simple-generic ( class generic def -- ) #! Just like: #! GENERIC: generic @@ -64,24 +58,11 @@ M: object delegate drop f ; : simple-slot-spec ( class slots -- spec ) [ simple-slot ] map-with ; -: set-delegate-prop ( base class slots -- ) - #! This sets the delegate-slot property of the class for - #! the benefit of tuples. Built-in types do not have - #! delegate slots. - swap >r [ "delegate" = dup [ >r 1 + r> ] unless ] some? [ - r> swap - 2dup "delegate-slot" set-word-prop - "delegate" [ "generic" ] search define-reader - ] [ - r> 2drop - ] ifte ; - : simple-slots ( base class slots -- ) #! Takes a list of slot names, and for each slot name #! defines a pair of words - and #! set--. Slot numbering is consecutive and #! begins at base. >r tuck r> - 3dup set-delegate-prop simple-slot-spec [ length [ + ] project-with ] keep zip define-slots ; diff --git a/library/generic/tuple.factor b/library/generic/tuple.factor index 879960b9b7..f4f9591d2f 100644 --- a/library/generic/tuple.factor +++ b/library/generic/tuple.factor @@ -4,6 +4,14 @@ IN: kernel-internals USING: words parser kernel namespaces lists strings math hashtables errors vectors ; +! Tuples are really arrays in the runtime, but with a different +! type number. The layout is as follows: + +! slot 0 - object header with type number (as usual) +! slot 1 - length, including class/delegate slots +! slot 2 - the class, a word +! slot 3 - the delegate tuple, or f + : make-tuple ( class size -- tuple ) #! Internal allocation function. Do not call it directly, #! since you can fool the runtime and corrupt memory by @@ -16,6 +24,18 @@ IN: generic BUILTIN: tuple 18 [ 1 array-capacity f ] ; +! So far, only tuples can have delegates, which also must be +! tuples (the UI uses numbers as delegates in a couple of places +! but this is Unsupported(tm)). +GENERIC: delegate +GENERIC: set-delegate + +M: object delegate drop f ; +M: tuple delegate 3 slot ; + +M: object set-delegate 2drop ; +M: tuple set-delegate 3 set-slot ; + #! arrayed objects can be passed to array-capacity, #! array-nth, and set-array-nth. UNION: arrayed array tuple ; @@ -48,15 +68,15 @@ UNION: arrayed array tuple ; #! If the new list of slots is different from the previous, #! forget the old definition. >r "use" get search dup [ - dup "tuple-size" word-prop r> length 1 + = + dup "tuple-size" word-prop r> length 2 + = [ drop ] [ forget ] ifte ] [ r> 2drop ] ifte ; : tuple-slots ( tuple slots -- ) - 2dup length 1 + "tuple-size" set-word-prop - 3 -rot simple-slots ; + 2dup length 2 + "tuple-size" set-word-prop + 4 -rot simple-slots ; : constructor-word ( word -- word ) word-name "<" swap ">" cat3 create-in ; @@ -123,7 +143,7 @@ UNION: arrayed array tuple ; ] [ 2drop [ dup delegate ] swap dup unit swap - unit [ car ] cons [ undefined-method ] append + unit [ car ] cons [ no-method ] append \ ?ifte 3list append ] ifte ] ifte ; @@ -143,16 +163,9 @@ UNION: arrayed array tuple ; #! delegate. dup array-capacity dup [ -rot copy-array ] keep ; -: clone-delegate ( tuple -- ) - dup class "delegate-slot" word-prop dup [ - [ >fixnum slot clone ] 2keep set-slot - ] [ - 2drop - ] ifte ; - M: tuple clone ( tuple -- tuple ) #! Clone a tuple and its delegate. - clone-tuple dup clone-delegate ; + clone-tuple dup delegate clone over set-delegate ; : tuple>list ( tuple -- list ) dup array-capacity swap array>list ; @@ -169,10 +182,12 @@ M: tuple = ( obj tuple -- ? ) ] ifte ; M: tuple hashcode ( vec -- n ) - dup array-capacity 1 number= [ + #! If the capacity is two, then all we have is the class + #! slot and delegate. + dup array-capacity 2 number= [ drop 0 ] [ - 1 swap array-nth hashcode + 2 swap array-nth hashcode ] ifte ; tuple [ diff --git a/library/httpd/html.factor b/library/httpd/html.factor index 934a3b908c..bc688f63e2 100644 --- a/library/httpd/html.factor +++ b/library/httpd/html.factor @@ -100,7 +100,7 @@ url-encoding presentation generic ; drop call ] ifte ; -TUPLE: html-stream delegate ; +TUPLE: html-stream ; M: html-stream stream-write-attr ( str style stream -- ) wrapper-stream-scope [ @@ -127,7 +127,7 @@ C: html-stream ( stream -- stream ) #! underline #! size #! link - an object path - [ >r r> set-html-stream-delegate ] keep ; + [ >r r> set-delegate ] keep ; : with-html-stream ( quot -- ) [ stdio [ ] change call ] with-scope ; diff --git a/library/inference/inference.factor b/library/inference/inference.factor index 0032e62317..05018eead9 100644 --- a/library/inference/inference.factor +++ b/library/inference/inference.factor @@ -33,21 +33,21 @@ TUPLE: value class recursion class-ties literal-ties ; C: value ( recursion -- value ) [ set-value-recursion ] keep ; -TUPLE: computed delegate ; +TUPLE: computed ; C: computed ( class -- value ) swap recursive-state get [ set-value-class ] keep - over set-computed-delegate ; + over set-delegate ; M: computed value= ( literal value -- ? ) 2drop f ; : failing-class-and ( class class -- class ) 2dup class-and dup null = [ - drop [ + -rot [ word-name , " and " , word-name , " do not intersect" , - ] make-string inference-error + ] make-string inference-warning ] [ 2nip ] ifte ; @@ -57,12 +57,12 @@ M: computed value-class-and ( class value -- ) value-class failing-class-and ] keep set-value-class ; -TUPLE: literal value delegate ; +TUPLE: literal value ; C: literal ( obj rstate -- value ) [ >r [ >r dup class r> set-value-class ] keep - r> set-literal-delegate + r> set-delegate ] keep [ set-literal-value ] keep ; diff --git a/library/inference/ties.factor b/library/inference/ties.factor index 0c6d113eda..7579e15a3b 100644 --- a/library/inference/ties.factor +++ b/library/inference/ties.factor @@ -24,7 +24,7 @@ USING: kernel lists prettyprint ; ! GENERIC: car ! M: cons car 0 slot ; ! -! The only branch that does not end with undefined-method pulls +! The only branch that does not end with no-method pulls ! a tie that sets the value's type to cons after two steps. ! Formally, a tie is a tuple. diff --git a/library/inference/words.factor b/library/inference/words.factor index 20cb06f93e..6932f897a2 100644 --- a/library/inference/words.factor +++ b/library/inference/words.factor @@ -173,7 +173,7 @@ M: word apply-object ( word -- ) \ + [ [ number number ] [ number ] ] "infer-effect" set-word-prop \ = [ [ object object ] [ object ] ] "infer-effect" set-word-prop -\ undefined-method t "terminator" set-word-prop -\ undefined-method [ [ object word ] [ ] ] "infer-effect" set-word-prop +\ no-method t "terminator" set-word-prop +\ no-method [ [ object word ] [ ] ] "infer-effect" set-word-prop \ not-a-number t "terminator" set-word-prop \ throw t "terminator" set-word-prop diff --git a/library/io/ansi.factor b/library/io/ansi.factor index 7068adafde..e48bfd51ed 100644 --- a/library/io/ansi.factor +++ b/library/io/ansi.factor @@ -48,11 +48,12 @@ presentation generic ; : ansi-attr-string ( string style -- string ) [ ansi-attrs , reset , ] make-string ; -TUPLE: ansi-stream delegate ; +TUPLE: ansi-stream ; +C: ansi-stream ( stream -- stream ) [ set-delegate ] keep ; M: ansi-stream stream-write-attr ( string style stream -- ) >r [ default-style ] unless* ansi-attr-string r> - ansi-stream-delegate stream-write ; + delegate stream-write ; IN: shells diff --git a/library/io/network.factor b/library/io/network.factor index 634d8679e5..3fd57e71f5 100644 --- a/library/io/network.factor +++ b/library/io/network.factor @@ -16,11 +16,11 @@ C: server ( port -- stream ) #! with accept. No other stream operations are supported. [ >r server-socket r> set-server-port ] keep ; -TUPLE: client-stream delegate host ; +TUPLE: client-stream host ; C: client-stream ( host port in out -- stream ) #! stream-flush yields until connection is established. - [ >r r> set-client-stream-delegate ] keep + [ >r r> set-delegate ] keep [ >r ":" swap unparse cat3 r> set-client-stream-host ] keep dup stream-flush ; diff --git a/library/io/stdio.factor b/library/io/stdio.factor index a00ce67de9..a8a4b4e000 100644 --- a/library/io/stdio.factor +++ b/library/io/stdio.factor @@ -29,10 +29,7 @@ SYMBOL: stdio call stdio get stream>str ] with-stream ; -TUPLE: stdio-stream delegate ; - -M: stdio-stream stream-auto-flush ( -- ) - stdio-stream-delegate stream-flush ; - -M: stdio-stream stream-close ( -- ) - drop ; +TUPLE: stdio-stream ; +C: stdio-stream ( stream -- stream ) [ set-delegate ] keep ; +M: stdio-stream stream-auto-flush ( -- ) delegate stream-flush ; +M: stdio-stream stream-close ( -- ) drop ; diff --git a/library/io/stream.factor b/library/io/stream.factor index d837fec85b..d90433569e 100644 --- a/library/io/stream.factor +++ b/library/io/stream.factor @@ -45,10 +45,10 @@ C: string-output ( size -- stream ) ! Sometimes, we want to have a delegating stream that uses stdio ! words. -TUPLE: wrapper-stream delegate scope ; +TUPLE: wrapper-stream scope ; C: wrapper-stream ( stream -- stream ) - 2dup set-wrapper-stream-delegate + 2dup set-delegate [ >r [ stdio set ] extend r> set-wrapper-stream-scope diff --git a/library/io/win32-io-internals.factor b/library/io/win32-io-internals.factor index ac7cef5875..026425f57c 100644 --- a/library/io/win32-io-internals.factor +++ b/library/io/win32-io-internals.factor @@ -142,7 +142,7 @@ END-STRUCT INVALID_HANDLE_VALUE NULL NULL 1 CreateIoCompletionPort completion-port set - << null-stream >> stdio set + << null-stream f >> stdio set [ 32 callbacks set diff --git a/library/io/win32-server.factor b/library/io/win32-server.factor index 23d4587c76..19718ea104 100644 --- a/library/io/win32-server.factor +++ b/library/io/win32-server.factor @@ -29,7 +29,7 @@ USING: alien errors generic kernel kernel-internals lists math namespaces win32-io-internals ; TUPLE: win32-server this ; -TUPLE: win32-client-stream delegate host ; +TUPLE: win32-client-stream host ; SYMBOL: winsock SYMBOL: socket @@ -72,7 +72,7 @@ SYMBOL: socket GetAcceptExSockaddrs r> indirect-pointer-value sockaddr>string ; C: win32-client-stream ( buf stream -- stream ) - [ set-win32-client-stream-delegate extract-remote-host ] keep + [ set-delegate extract-remote-host ] keep [ set-win32-client-stream-host ] keep ; M: win32-client-stream client-stream-host win32-client-stream-host ; diff --git a/library/test/dataflow.factor b/library/test/dataflow.factor index 79dc0fefe1..2e79aefa05 100644 --- a/library/test/dataflow.factor +++ b/library/test/dataflow.factor @@ -63,10 +63,10 @@ USE: generic ] unit-test ! [ t ] [ -! [ { [ drop ] [ undefined-method ] [ drop ] [ undefined-method ] } generic ] dataflow +! [ { [ drop ] [ no-method ] [ drop ] [ no-method ] } generic ] dataflow ! \ dispatch swap dataflow-contains-op? car [ ! node-param get [ -! [ [ node-param get \ undefined-method = ] bind ] some? +! [ [ node-param get \ no-method = ] bind ] some? ! ] some? ! ] bind >boolean ! ] unit-test diff --git a/library/test/gadgets.factor b/library/test/gadgets.factor index 5f5b62a1ff..676b4e794c 100644 --- a/library/test/gadgets.factor +++ b/library/test/gadgets.factor @@ -63,24 +63,10 @@ USING: gadgets kernel lists math namespaces test ; [ 100 x set 100 y set - #{ 110 115 }# << line 0 0 100 150 >> inside? + #{ 110 115 }# << line f 0 0 100 150 >> inside? ] with-scope ] unit-test -[ - [ - 100 - 200 - 300 - ] -] [ - [ - 0 0 100 100 , - 0 0 200 200 , - 0 0 300 300 , - ] make-list w/h drop 0 swap dup greatest swap layout-fill -] unit-test - [ 300 620 ] [ @@ -90,3 +76,5 @@ USING: gadgets kernel lists math namespaces test ; 0 0 300 300 "pile" get add-gadget "pile" get pref-size ] unit-test + +[ ] [ "pile" get layout* ] unit-test diff --git a/library/test/generic.factor b/library/test/generic.factor index 02b35643e4..8be778fa4c 100644 --- a/library/test/generic.factor +++ b/library/test/generic.factor @@ -117,4 +117,4 @@ M: for-arguments-sake empty-method-test drop "Hi" ; TUPLE: another-one ; [ "Hi" ] [ empty-method-test empty-method-test ] unit-test -[ << another-one >> ] [ empty-method-test ] unit-test +[ << another-one f >> ] [ empty-method-test ] unit-test diff --git a/library/test/inference.factor b/library/test/inference.factor index 2dd4c3d823..4ec2dbb2e0 100644 --- a/library/test/inference.factor +++ b/library/test/inference.factor @@ -236,3 +236,11 @@ M: fixnum potential-hang dup [ potential-hang ] when ; ! [ [ [ ] [ POSTPONE: f ] ] ] [ [ 5 not ] infer ] unit-test ! ! [ [ [ object ] [ general-t ] ] ] [ [ dup [ not ] unless ] infer ] unit-test + +TUPLE: funny-cons car cdr ; +GENERIC: iterate +M: funny-cons iterate funny-cons-cdr iterate ; +M: f iterate drop ; +M: real iterate drop ; + +[ [[ 1 0 ]] ] [ [ iterate ] infer old-effect ] unit-test diff --git a/library/test/tuple.factor b/library/test/tuple.factor index 1f83d61929..73f55e5b87 100644 --- a/library/test/tuple.factor +++ b/library/test/tuple.factor @@ -20,9 +20,9 @@ M: object delegation-test drop 3 ; TUPLE: quux-tuple ; C: quux-tuple ; M: quux-tuple delegation-test drop 4 ; -TUPLE: quuux-tuple delegate ; +TUPLE: quuux-tuple ; C: quuux-tuple - [ set-quuux-tuple-delegate ] keep ; + [ set-delegate ] keep ; [ 3 ] [ delegation-test ] unit-test @@ -30,9 +30,9 @@ GENERIC: delegation-test-2 TUPLE: quux-tuple-2 ; C: quux-tuple-2 ; M: quux-tuple-2 delegation-test-2 drop 4 ; -TUPLE: quuux-tuple-2 delegate ; +TUPLE: quuux-tuple-2 ; C: quuux-tuple-2 - [ set-quuux-tuple-2-delegate ] keep ; + [ set-delegate ] keep ; [ 4 ] [ delegation-test-2 ] unit-test diff --git a/library/tools/debugger.factor b/library/tools/debugger.factor index ce7a254a29..8b467c713d 100644 --- a/library/tools/debugger.factor +++ b/library/tools/debugger.factor @@ -142,12 +142,12 @@ M: object error. ( error -- ) kernel-error 12 setenv ; -M: undefined-method error. ( error -- ) +M: no-method error. ( error -- ) [ "The generic word " , - dup undefined-method-generic unparse , + dup no-method-generic unparse , " does not have a suitable method for " , - undefined-method-object unparse , + no-method-object unparse , ] make-string print ; ! So that stage 2 boot gives a useful error message if something diff --git a/library/tools/jedit-wire.factor b/library/tools/jedit-wire.factor index 7054832cfc..d9d6fcd16c 100644 --- a/library/tools/jedit-wire.factor +++ b/library/tools/jedit-wire.factor @@ -78,7 +78,7 @@ USE: listener dup string-length write-big-endian-32 write ; -TUPLE: jedit-stream delegate ; +TUPLE: jedit-stream ; M: jedit-stream stream-readln ( stream -- str ) wrapper-stream-scope @@ -93,7 +93,7 @@ M: jedit-stream stream-flush ( stream -- ) [ CHAR: f write flush ] bind ; C: jedit-stream ( stream -- stream ) - [ >r r> set-jedit-stream-delegate ] keep ; + [ >r r> set-delegate ] keep ; : stream-server ( -- ) #! Execute this in the inferior Factor. diff --git a/library/ui/checkboxes.factor b/library/ui/checkboxes.factor index 2d112164fa..1242cf19c8 100644 --- a/library/ui/checkboxes.factor +++ b/library/ui/checkboxes.factor @@ -8,7 +8,7 @@ USING: generic kernel lists math namespaces sdl ; >r tuck neg >r >r >r 0 r> r> r> r> 2list ; -TUPLE: checkbox bevel selected? delegate ; +TUPLE: checkbox bevel selected? ; : init-checkbox-bevel ( bevel checkbox -- ) 2dup set-checkbox-bevel add-gadget ; @@ -38,7 +38,7 @@ TUPLE: checkbox bevel selected? delegate ; [ checkbox-bevel button-update ] [ mouse-enter ] set-action ; C: checkbox ( label -- checkbox ) - over set-checkbox-delegate + over set-delegate [ f line-border swap init-checkbox-bevel ] keep [ >r