]> gitweb.factorcode.org Git - factor.git/commitdiff
more code cleanups; new make-hash idiom
authorSlava Pestov <slava@factorcode.org>
Mon, 22 Aug 2005 06:06:32 +0000 (06:06 +0000)
committerSlava Pestov <slava@factorcode.org>
Mon, 22 Aug 2005 06:06:32 +0000 (06:06 +0000)
25 files changed:
TODO.FACTOR.txt
library/alien/aliens.factor
library/alien/c-types.factor
library/alien/compiler.factor
library/bootstrap/boot-stage1.factor
library/bootstrap/boot-stage2.factor
library/bootstrap/image.factor
library/bootstrap/init.factor
library/collections/namespaces.factor
library/collections/sequences.factor
library/collections/vectors-epilogue.factor [deleted file]
library/collections/vectors.factor
library/compiler/assembler.factor
library/compiler/compiler.factor
library/generic/math-combination.factor
library/httpd/cont-responder.factor
library/httpd/default-responders.factor
library/httpd/responder.factor
library/inference/branches.factor
library/io/stream.factor
library/test/inference.factor
library/ui/line-editor.factor
library/vocabularies.factor
library/win32/win32-server.factor
library/win32/win32-stream.factor

index 48a6c1e0fba5c5a5a5422bdb3bc70b3f006343c7..6edbdf3d82c26c2a28e3f2fb0a477c0e4a56378b 100644 (file)
@@ -1,6 +1,11 @@
++ messy code hall of shame:\r
+\r
+- alien/c-types.factor is ugly\r
+- compile-byte/cell: instantiating aliens\r
+- buffer: instantiating aliens\r
+\r
 - flushing optimization\r
-- new prettyprinter\r
-  - reader syntax for arrays, byte arrays, displaced aliens\r
+- reader syntax for arrays, byte arrays, displaced aliens\r
 - split, group: return vectors\r
 - sleep word\r
 \r
index 54a3dd6429f31ebed4a2bb96386ac8b5bee0ef5d..7f721127b5f47088f87dc75519768295664e4276 100644 (file)
@@ -35,10 +35,7 @@ M: alien = ( obj obj -- ? )
 
 : add-library ( library name abi -- )
     "libraries" get [
-        <namespace> [
-          "abi" set
-          "name" set
-        ] extend swap set
+        [ "abi" set "name" set ] make-hash swap set
     ] bind ;
 
 : library-abi ( library -- abi )
index 4798b89a04596ede16abab3ff2d68e535ffc0651..86e54367600eb8fa711c2c738607cf9f0b4c5abb 100644 (file)
@@ -6,14 +6,14 @@ hashtables kernel kernel-internals lists math namespaces parser
 sequences strings words ;
 
 : <c-type> ( -- type )
-    <namespace> [
-        [ "No setter" throw ] "setter" set
-        [ "No getter" throw ] "getter" set
-        "no boxer" "boxer" set
-        "no unboxer" "unboxer" set
-        << int-regs f >> "reg-class" set
-        0 "width" set
-    ] extend ;
+    {{
+        [[ "setter" [ "No setter" throw ] ]]
+        [[ "getter" [ "No getter" throw ] ]]
+        [[ "boxer" "no boxer" ]]
+        [[ "unboxer" "no unboxer" ]]
+        [[ "reg-class" << int-regs f >> ]]
+        [[ "width" 0 ]]
+    }} clone ;
 
 SYMBOL: c-types
 
@@ -26,7 +26,7 @@ SYMBOL: c-types
     c-type [ "width" get ] bind ;
 
 : define-c-type ( quot name -- )
-    >r <c-type> swap extend r> c-types get set-hash ;
+    >r <c-type> [ swap bind ] keep r> c-types get set-hash ;
 
 : <c-object> ( size -- c-ptr ) cell / ceiling <byte-array> ;
 
index 7e152638ae1ed5532ad218d2b8885202642dbae8..a4a153ac6b09313937c69dc3b432ef51b200c112 100644 (file)
@@ -33,14 +33,11 @@ C: alien-error ( lib sym -- )
     [ set-alien-error-library ] keep ;
 
 M: alien-error error. ( error -- )
-    [
-        "C library interface words cannot be interpreted. " %
-        "Either the compiler is disabled, " %
-        "or the " % dup alien-error-library unparse %
-        " library does not define the " %
-        alien-error-symbol unparse %
-        " symbol." %
-    ] make-string print ;
+    "C library interface words cannot be interpreted. " write
+    "Either the compiler is disabled, " write
+    "or the " write dup alien-error-library pprint
+    " library does not define the " write
+    alien-error-symbol pprint " symbol." print ;
 
 : alien-invoke ( ... return library function parameters -- ... )
     #! Call a C library function.
index 8bb76f3a77ecb939f8ad060df540a85f5a37743c..15c945eb19cda8a908a45e633fc04e8d90377756 100644 (file)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2004, 2005 Slava Pestov.
 ! See http://factor.sf.net/license.txt for BSD license.
 IN: image
-USING: generic hashtables kernel lists math memory namespaces
-parser prettyprint sequences io vectors words ;
+USING: generic hashtables kernel kernel-internals
+lists math memory namespaces parser prettyprint
+sequences io vectors words ;
 
 "Bootstrap stage 1..." print
 
@@ -28,14 +29,13 @@ parser prettyprint sequences io vectors words ;
 
         "/library/collections/growable.factor"
         "/library/collections/cons.factor"
-        "/library/collections/vectors.factor"
         "/library/collections/virtual-sequences.factor"
         "/library/collections/sequences-epilogue.factor"
         "/library/collections/strings.factor"
         "/library/collections/sbuf.factor"
         "/library/collections/assoc.factor"
         "/library/collections/lists.factor"
-        "/library/collections/vectors-epilogue.factor"
+        "/library/collections/vectors.factor"
         "/library/collections/hashtables.factor"
         "/library/collections/namespaces.factor"
         "/library/collections/sequence-eq.factor"
index 18be3546a9fcf21a526b7a3cf2ed0d02be2216c2..e5bed970be8f426cc4e8df79f787b85f9bd85ce5 100644 (file)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2004, 2005 Slava Pestov.\r
 ! See http://factor.sf.net/license.txt for BSD license.\r
 USING: alien assembler command-line compiler compiler-backend\r
-errors generic hashtables io io-internals kernel lists math\r
-memory namespaces parser sequences words ;\r
+errors generic hashtables io io-internals kernel\r
+kernel-internals lists math memory namespaces parser sequences\r
+words ;\r
 \r
 : pull-in ( ? list -- )\r
     swap [\r
index 9fe0af25c0e164df433024c03751321b993de316..5b6f12c6f9a95c0d2d2e258101f66b6a466db45f 100644 (file)
@@ -253,9 +253,9 @@ M: hashtable ' ( hashtable -- pointer )
     all-words [ emit-word ] each ;
 
 : global, ( -- )
-    <namespace> [
+    [
         { vocabularies typemap builtins } [ [ ] change ] each
-    ] extend '
+    ] make-hash '
     global-offset fixup ;
 
 : boot, ( quot -- )
index 6d51e545d93b00ae9a0532cf8e4f275096eff28e..61b5fdee4da1685b46b71ddd37781fb645f86125 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2004, 2005 Slava Pestov.
 ! See http://factor.sf.net/license.txt for BSD license.
-IN: kernel
-USING: assembler command-line errors io io-internals namespaces
-parser threads words ;
+IN: kernel-internals
+USING: assembler command-line errors io io-internals kernel
+namespaces parser threads words ;
 
 : boot ( -- )
     #! Initialize an interpreter with the basic services.
index a401d9cd3c9ccf9bacd1f8478c959bfdf8d82006..7bb433246867f524668fdd02a52021bc4347d161 100644 (file)
@@ -88,18 +88,9 @@ strings vectors words ;
     #! Execute a quotation with a namespace on the namestack.
     swap >n call n> drop ; inline
 
-: with-scope ( quot -- )
-    #! Execute a quotation with a new namespace on the
-    #! namestack.
-    <namespace> >n call n> drop ; inline
-
-: extend ( namespace code -- namespace )
-    #! Used in code like this:
-    #! : <subclass>
-    #!      <superclass> [
-    #!          ....
-    #!      ] extend ;
-    over >r bind r> ; inline
+: make-hash ( quot -- hash ) <namespace> >n call n> ; inline
+
+: with-scope ( quot -- ) make-hash drop ; inline
 
 ! Building sequences
 SYMBOL: building
@@ -139,28 +130,21 @@ SYMBOL: building
 ! Building hashtables, and computing a transitive closure.
 SYMBOL: hash-buffer
 
-: make-hash ( quot -- hash )
-    [
-        <namespace> hash-buffer set
-        call
-        hash-buffer get
-    ] with-scope ; inline
-
-: hash, ( value key -- old )
+: closure, ( value key -- old )
     hash-buffer get [ hash swap ] 2keep set-hash ;
 
 : (closure) ( key hash -- )
     tuck hash dup [
         hash-keys [
-            dup dup hash, [
-                2drop
-            ] [
-                swap (closure)
-            ] ifte
+            dup dup closure, [ 2drop ] [ swap (closure) ] ifte
         ] each-with
     ] [
         2drop
     ] ifte ;
 
 : closure ( key hash -- list )
-    [ (closure) ] make-hash hash-keys ;
+    [
+        <namespace> hash-buffer set
+        (closure)
+        hash-buffer get hash-keys
+    ] with-scope ;
index 7b4dd85a1e5c6c2f5d1d4af8c75b897d747dbe9e..cef19dee68e1e43fded5fb4b52c0ef6149fcbd80 100644 (file)
@@ -13,9 +13,9 @@ USING: errors generic kernel math math-internals strings vectors ;
 
 GENERIC: empty? ( sequence -- ? ) flushable
 GENERIC: length ( sequence -- n ) flushable
-GENERIC: set-length ( n sequence -- ) flushable
+GENERIC: set-length ( n sequence -- )
 GENERIC: nth ( n sequence -- obj ) flushable
-GENERIC: set-nth ( value n sequence -- obj ) flushable
+GENERIC: set-nth ( value n sequence -- obj )
 GENERIC: thaw ( seq -- mutable-seq ) flushable
 GENERIC: like ( seq seq -- seq ) flushable
 GENERIC: reverse ( seq -- seq ) flushable
diff --git a/library/collections/vectors-epilogue.factor b/library/collections/vectors-epilogue.factor
deleted file mode 100644 (file)
index dcb4a81..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-! Copyright (C) 2004, 2005 Slava Pestov.
-! See http://factor.sf.net/license.txt for BSD license.
-USING: errors generic kernel kernel-internals lists math
-math-internals sequences ;
-
-IN: vectors
-
-: empty-vector ( len -- vec )
-    dup <vector> [ set-length ] keep ; inline
-
-: >vector ( list -- vector )
-    dup length <vector> [ swap nappend ] keep ; inline
-
-M: object thaw >vector ;
-
-M: vector clone ( vector -- vector ) >vector ;
-
-M: general-list like drop >list ;
-
-M: vector like drop >vector ;
-
-: (1vector) [ push ] keep ; inline
-: (2vector) [ swapd push ] keep (1vector) ; inline
-: (3vector) [ >r rot r> push ] keep (2vector) ; inline
-
-: 1vector ( x -- { x } ) 1 <vector> (1vector) ; flushable
-: 2vector ( x y -- { x y } ) 2 <vector> (2vector) ; flushable
-: 3vector ( x y z -- { x y z } ) 3 <vector> (3vector) ; flushable
index 49fb03c2441214bb051b06dcb33454e911a3b3bf..e25c91ab577269ad7d83941a24df5206cf09867d 100644 (file)
@@ -13,3 +13,25 @@ M: vector set-nth ( obj n vec -- )
 
 M: vector hashcode ( vec -- n )
     dup length 0 number= [ drop 0 ] [ first hashcode ] ifte ;
+
+: empty-vector ( len -- vec )
+    dup <vector> [ set-length ] keep ; inline
+
+: >vector ( list -- vector )
+    dup length <vector> [ swap nappend ] keep ; inline
+
+M: object thaw >vector ;
+
+M: vector clone ( vector -- vector ) >vector ;
+
+M: general-list like drop >list ;
+
+M: vector like drop >vector ;
+
+: (1vector) [ push ] keep ; inline
+: (2vector) [ swapd push ] keep (1vector) ; inline
+: (3vector) [ >r rot r> push ] keep (2vector) ; inline
+
+: 1vector ( x -- { x } ) 1 <vector> (1vector) ; flushable
+: 2vector ( x y -- { x y } ) 2 <vector> (2vector) ; flushable
+: 3vector ( x y z -- { x y z } ) 3 <vector> (3vector) ; flushable
index 9c35d82ca932f953256a0dd2a883e54e12a7cc31..ee45e72c875fb68e5c69d95e060c6b1dad1b4aac 100644 (file)
@@ -20,15 +20,13 @@ SYMBOL: interned-literals
 : compile-aligned ( n -- )
     compiled-offset cell 2 * align set-compiled-offset ; inline
 
+: add-literal ( obj -- lit# )
+    address
+    literal-top set-compiled-cell
+    literal-top dup cell + set-literal-top ;
+
 : intern-literal ( obj -- lit# )
-    dup interned-literals get hash [ ] [
-        [
-            address
-            literal-top set-compiled-cell
-            literal-top dup cell + set-literal-top
-            dup
-        ] keep interned-literals get set-hash
-    ] ?ifte ;
+    interned-literals get [ add-literal ] cache ;
 
 : compile-byte ( n -- )
     compiled-offset set-compiled-byte
index 40d75018c894387628dd241e8ed2413a896b8414..52d919d66a2f52f76d5f401760443377104bdbf7 100644 (file)
@@ -60,4 +60,6 @@ M: compound (compile) ( word -- )
     dup decompile compile ;
 
 : compile-1 ( quot -- word )
+    #! Compute a quotation into an uninterned word, for testing
+    #! purposes.
     gensym [ swap define-compound ] keep dup compile execute ;
index 5338fae5d1e972ba3a9d95b67a8e7e08d43d3d9d..61d0ce75002040bc457a039ccc2841930ec59451 100644 (file)
@@ -18,7 +18,8 @@ math namespaces sequences words ;
 
 : math-upgrade ( left right -- quot )
     2dup math-class< [
-        nip [ \ >r , "coercer" word-prop % \ r> , ] make-list
+        nip "coercer" word-prop
+        dup [ [ >r ] swap [ r> ] append3 ] when
     ] [
         2dup swap math-class< [
             drop "coercer" word-prop
index a91a13e90ad2717d93a79dd87b1d0968eddbd7ad..c156f8c29323c01a43de73ea76090f1958d977c7 100644 (file)
@@ -301,14 +301,13 @@ SYMBOL: root-continuation
   #! Convert the quotation so it is run within a session namespace
   #! and that namespace is initialized first.
   \ init-session-namespace swons [ , \ with-scope , ] make-list
-  <responder> 
+  [ 
      [ cont-get/post-responder ] "get" set 
      [ cont-get/post-responder ] "post" set 
-     over "responder-name" set
-     over "responder" set
+     swap "responder" set
      reset-continuation-table 
      permanent register-continuation root-continuation set 
-   ] extend swap responders get set-hash ;
+  ] make-responder ;
 
 : responder-items ( name -- items )
   #! Return the table of continuation items for a given responder. 
index 699a0d0e633f432ef4cce18c78a8fb8aa4c1d06c..ef7ad5b84797566b2efc457a62fb51b1cf46749a 100644 (file)
@@ -12,33 +12,33 @@ global [
 
     ! Runs all unit tests and dumps result to the client. This uses
     ! a lot of server resources, so disable it on a busy server.
-    <responder> [
+    [
         "test" "responder" set
         [ test-responder ] "get" set
-    ] extend add-responder
+    ] make-responder
     
     ! 404 error message pages are served by this guy
-    <responder> [
+    [
         "404" "responder" set
         [ drop no-such-responder ] "get" set
-    ] extend add-responder
+    ] make-responder
     
     ! Serves files from a directory stored in the "doc-root"
     ! variable. You can set the variable in the global namespace,
     ! or inside the responder.
-    <responder> [
+    [
         ! "/var/www/" "doc-root" set
         "file" "responder" set
         [ file-responder ] "get" set
         [ file-responder ] "post" set
         [ file-responder ] "head" set
-    ] extend add-responder
+    ] make-responder
     
     ! Serves Factor source code 
-    <responder> [
+    [
         "resource" "responder" set
         [ resource-responder ] "get" set
-    ] extend add-responder
+    ] make-responder
     
     ! Servers Factor word definitions from the image.
     "browser" [ browser-responder ] install-cont-responder
index 61420248b56de88c54649fba898da6cd0c6f77d2..20b44f37d971cb3f5924e212628fd8d1eb097fa5 100644 (file)
@@ -93,8 +93,12 @@ SYMBOL: responders
 ! - header -- an alist of headers from the user's client
 ! - response -- an alist of the POST request response
 
-: <responder> ( -- responder )
-    <namespace> [
+: add-responder ( responder -- )
+    #! Add a responder object to the list.
+    "responder" over hash  responders get set-hash ;
+
+: make-responder ( quot -- responder )
+    [
         ( url -- )
         [
             drop "GET method not implemented" httpd-error
@@ -111,7 +115,9 @@ SYMBOL: responders
         [
             drop bad-request
         ] "bad" set
-    ] extend ;
+        
+        call
+    ] make-hash add-responder ;
 
 : vhost ( name -- responder )
     vhosts get hash [ "default" vhost ] unless* ;
@@ -160,7 +166,3 @@ SYMBOL: responders
 
 : no-such-responder ( -- )
     "404 No such responder" httpd-error ;
-
-: add-responder ( responder -- )
-    #! Add a responder object to the list.
-    "responder" over hash  responders get set-hash ;
index 0b277c039264efa92101f14e8cf13d60e3cce328..532e7b55695d41ddc4ac0d3a02584510fe9fb6f3 100644 (file)
@@ -73,12 +73,12 @@ namespaces parser prettyprint sequences strings vectors words ;
     #! Return a namespace with inferencer variables:
     #! meta-d, meta-r, d-in. They are set to f if
     #! terminate was called.
-    <namespace> [
+    [
         copy-inference
         dup value-recursion recursive-state set
         literal-value dup infer-quot handle-terminator
         active? [ #values node, ] when
-    ] extend ;
+    ] make-hash ;
 
 : (infer-branches) ( branchlist -- list )
     [ infer-branch ] map dup unify-effects
index daf910c9ad94b3c1fac84c8eed0efca4f63aa7bb..01710480c9b17fb5699847f9bb5e8050d8580920 100644 (file)
@@ -51,8 +51,7 @@ TUPLE: wrapper-stream scope ;
 
 C: wrapper-stream ( stream -- stream )
     2dup set-delegate [
-        >r <namespace> [ stdio set ] extend r>
-        set-wrapper-stream-scope
+        >r [ stdio set ] make-hash r> set-wrapper-stream-scope
     ] keep ;
 
 : with-wrapper ( stream quot -- )
index 48c10f511f292addfda3f0c20341085083adf337..401d826da97476c6b943c6bba0c687c0bb049d37 100644 (file)
@@ -149,6 +149,12 @@ M: real iterate drop ;
 
 [ [ callstack ] infer simple-effect ] unit-test-fails
 
+DEFER: agent
+: smith 1 + agent ; inline
+: agent dup 0 = [ [ swap call ] 2keep [ smith ] 2keep ] when ; inline
+[ [ [ ] [ object object ] ] ]
+[ [ [ drop ] 0 agent ] infer ] unit-test
+
 ! : no-base-case dup [ no-base-case ] [ no-base-case ] ifte ;
 ! 
 ! [ [ no-base-case ] infer simple-effect ] unit-test-fails
@@ -201,27 +207,6 @@ M: real iterate drop ;
 
 [ { 0 1 } ] [ [ bad-code ] infer simple-effect ] unit-test
 
-! Type inference
-
-! [ [ [ object ] [ ] ] ] [ [ drop ] infer simple-effect ] unit-test
-! [ [ [ object ] [ object object ] ] ] [ [ dup ] infer simple-effect ] unit-test
-! [ [ [ object object ] [ cons ] ] ] [ [ cons ] infer simple-effect ] unit-test
-! [ [ [ object ] [ boolean ] ] ] [ [ dup [ drop t ] unless ] infer simple-effect ] unit-test
-! [ [ [ general-list ] [ cons ] ] ] [ [ uncons cons ] infer simple-effect ] unit-test
-
-! [ [ 5 car ] infer simple-effect ] unit-test-fails
-
-! [ [ [ number ] [ number ] ] ] [ [ dup + ] infer simple-effect ] unit-test
-! [ [ [ number number number ] [ number ] ] ] [ [ digit+ ] infer simple-effect ] unit-test
-! [ [ [ number ] [ real real ] ] ] [ [ >rect ] infer simple-effect ] unit-test
-
-! [ [ [ ] [ POSTPONE: t ] ] ] [ [ f not ] infer simple-effect ] unit-test
-! [ [ [ ] [ POSTPONE: f ] ] ] [ [ t not ] infer simple-effect ] unit-test
-! [ [ [ ] [ POSTPONE: f ] ] ] [ [ 5 not ] infer simple-effect ] unit-test
-! [ [ [ object ] [ general-t ] ] ] [ [ dup [ not ] unless ] infer simple-effect ] unit-test
-
-! [ [ [ object ] [ cons ] ] ] [ [ dup cons? [ drop [{ 1 2 }] ] unless ] infer simple-effect ] unit-test
-
 ! This form should not have a stack effect
 ! : bad-bin 5 [ 5 bad-bin bad-bin 5 ] [ 2drop ] ifte ;
 ! [ [ bad-bin ] infer simple-effect ] unit-test-fails
@@ -232,3 +217,7 @@ M: real iterate drop ;
 !     dup [ drop bad-recursion-1 5 ] [ ] ifte ;
 ! 
 ! [ [ bad-recursion-1 ] infer simple-effect ] unit-test-fails
+
+! This hangs
+
+! [ ] [ [ [ dup call ] dup call ] infer ] unit-test-fails
index 115b1c673fccfc3f9f1bde5cca199b0fd0090699..4979b6e3b2566eb9eb40c9188dc4c283af4c9287 100644 (file)
@@ -61,11 +61,11 @@ SYMBOL: history-index
     "" line-text set ;
 
 : <line-editor> ( -- editor )
-    <namespace> [
+    [
         line-clear
         100 <vector> history set
         0 history-index set
-    ] extend ;
+    ] make-hash ;
 
 : caret-insert ( str offset -- )
     #! Call this in the line editor scope.
index 0f1396c5104f7e378aa20f1bd9de7eff69938fd0..302ad0ab62f118ec242a041b65cb021f479f8d06 100644 (file)
@@ -45,7 +45,7 @@ SYMBOL: vocabularies
     [ vocab ?hash ] map-with [ ] find nip ;
 
 : <props> ( name vocab -- plist )
-    <namespace> [ "vocabulary" set "name" set ] extend ;
+    [ "vocabulary" set "name" set ] make-hash ;
 
 : (create) ( name vocab -- word )
     #! Create an undefined word without adding to a vocabulary.
index 7a8bfc7be4e08f1d4901411b8bd09e540ed7f727..0feafa3d82a13b94f02db9c2f667763614dd7a2c 100644 (file)
@@ -79,12 +79,12 @@ M: win32-client-stream client-stream-host win32-client-stream-host ;
 M: win32-client-stream client-stream-port win32-client-stream-port ;
 
 C: win32-server ( port -- server )
-    swap <namespace> 
+    swap [ 
         maybe-init-winsock new-socket swap over bind-socket dup listen-socket 
         dup add-completion
         socket set
         dup stream set
-    ] extend over set-win32-server-this ;
+    ] make-hash over set-win32-server-this ;
 
 M: win32-server stream-close ( server -- )
     win32-server-this [ socket get CloseHandle drop ] bind ;
index 80def2d88fa7633482c299522a77a05628aa02f6..7cb058d8d120db3c8218173cb871f4f933e3e023 100644 (file)
@@ -156,7 +156,7 @@ M: win32-stream expire ( stream -- )
     ] bind ;
 
 C: win32-stream ( handle -- stream )
-    swap <namespace> [
+    swap [
         dup NULL GetFileSize dup -1 = not [
             file-size set
         ] [ drop f file-size set ] ifte
@@ -165,7 +165,7 @@ C: win32-stream ( handle -- stream )
         4096 <buffer> out-buffer set
         0 fileptr set 
         dup stream set
-    ] extend over set-win32-stream-this ;
+    ] make-hash over set-win32-stream-this ;
 
 : <win32-file-reader> ( path -- stream )
     t f win32-open-file <win32-stream> <line-reader> ;