++ 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
: 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 )
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
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> ;
[ 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.
! 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
"/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"
! 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
all-words [ emit-word ] each ;
: global, ( -- )
- <namespace> [
+ [
{ vocabularies typemap builtins } [ [ ] change ] each
- ] extend '
+ ] make-hash '
global-offset fixup ;
: boot, ( quot -- )
! 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.
#! 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
! 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 ;
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
+++ /dev/null
-! 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
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
: 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
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 ;
: 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
#! 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.
! 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
! - 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
[
drop bad-request
] "bad" set
- ] extend ;
+
+ call
+ ] make-hash add-responder ;
: vhost ( name -- responder )
vhosts get hash [ "default" vhost ] unless* ;
: 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 ;
#! 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
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 -- )
[ [ 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
[ { 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
! 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
"" 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.
[ 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.
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 ;
] bind ;
C: win32-stream ( handle -- stream )
- swap <namespace> [
+ swap [
dup NULL GetFileSize dup -1 = not [
file-size set
] [ drop f file-size set ] ifte
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> ;