Merge git://factorcode.org/git/factor

db4
Eduardo Cavazos 2008-02-24 21:31:09 -06:00
commit 60ac55ca91
22 changed files with 130 additions and 88 deletions

View File

@ -43,7 +43,7 @@ M: object uses drop f ;
: xref ( defspec -- ) dup uses crossref get add-vertex ; : xref ( defspec -- ) dup uses crossref get add-vertex ;
: usage ( defspec -- seq ) crossref get at keys ; : usage ( defspec -- seq ) \ f or crossref get at keys ;
GENERIC: redefined* ( defspec -- ) GENERIC: redefined* ( defspec -- )

View File

@ -102,11 +102,13 @@ M: method-body stack-effect
! Definition protocol ! Definition protocol
M: method-spec where M: method-spec where
dup first2 method [ method-loc ] [ second where ] ?if ; dup first2 method [ method-word ] [ second ] ?if where ;
M: method-spec set-where first2 method set-method-loc ; M: method-spec set-where
first2 method method-word set-where ;
M: method-spec definer drop \ M: \ ; ; M: method-spec definer
drop \ M: \ ; ;
M: method-spec definition M: method-spec definition
first2 method dup [ method-def ] when ; first2 method dup [ method-def ] when ;
@ -114,9 +116,21 @@ M: method-spec definition
: forget-method ( class generic -- ) : forget-method ( class generic -- )
check-method check-method
[ delete-at* ] with-methods [ delete-at* ] with-methods
[ method-word forget ] [ drop ] if ; [ method-word forget-word ] [ drop ] if ;
M: method-spec forget* first2 forget-method ; M: method-spec forget*
first2 forget-method ;
M: method-body definer
drop \ M: \ ; ;
M: method-body definition
"method" word-prop method-def ;
M: method-body forget*
"method" word-prop
{ method-specializer method-generic } get-slots
forget-method ;
: implementors* ( classes -- words ) : implementors* ( classes -- words )
all-words [ all-words [

View File

@ -351,13 +351,18 @@ IN: temporary
<< file get parsed >> file set << file get parsed >> file set
: ~a ; : ~a ;
: ~b ~a ;
DEFER: ~b
"IN: temporary : ~b ~a ;" <string-reader>
"smudgy" parse-stream drop
: ~c ; : ~c ;
: ~d ; : ~d ;
{ H{ { ~a ~a } { ~c ~c } { ~d ~d } } H{ } } old-definitions set { H{ { ~a ~a } { ~b ~b } { ~c ~c } { ~d ~d } } H{ } } old-definitions set
{ H{ { ~d ~d } } H{ } } new-definitions set { H{ { ~b ~b } { ~d ~d } } H{ } } new-definitions set
[ V{ ~b } { ~a } { ~a ~c } ] [ [ V{ ~b } { ~a } { ~a ~c } ] [
smudged-usage smudged-usage
@ -365,6 +370,24 @@ IN: temporary
] unit-test ] unit-test
] with-scope ] with-scope
[
<< file get parsed >> file set
GENERIC: ~e
: ~f ~e ;
: ~g ;
{ H{ { ~e ~e } { ~f ~f } { ~g ~g } } H{ } } old-definitions set
{ H{ { ~g ~g } } H{ } } new-definitions set
[ V{ } { } { ~e ~f } ]
[ smudged-usage natural-sort ]
unit-test
] with-scope
[ ] [ [ ] [
"IN: temporary USE: kernel PREDICATE: object foo ( x -- y ) ;" eval "IN: temporary USE: kernel PREDICATE: object foo ( x -- y ) ;" eval
] unit-test ] unit-test

View File

@ -439,11 +439,12 @@ SYMBOL: interactive-vocabs
"Warning: the following definitions were removed from sources," print "Warning: the following definitions were removed from sources," print
"but are still referenced from other definitions:" print "but are still referenced from other definitions:" print
nl nl
dup stack. dup sorted-definitions.
nl nl
"The following definitions need to be updated:" print "The following definitions need to be updated:" print
nl nl
over stack. over sorted-definitions.
nl
] when 2drop ; ] when 2drop ;
: filter-moved ( assoc -- newassoc ) : filter-moved ( assoc -- newassoc )

View File

@ -174,6 +174,12 @@ M: hook-generic synopsis*
M: method-spec synopsis* M: method-spec synopsis*
dup definer. [ pprint-word ] each ; dup definer. [ pprint-word ] each ;
M: method-body synopsis*
dup definer.
"method" word-prop dup
method-specializer pprint*
method-generic pprint* ;
M: mixin-instance synopsis* M: mixin-instance synopsis*
dup definer. dup definer.
dup mixin-instance-class pprint-word dup mixin-instance-class pprint-word
@ -188,6 +194,15 @@ M: pathname synopsis* pprint* ;
[ synopsis* ] with-in [ synopsis* ] with-in
] with-string-writer ; ] with-string-writer ;
: synopsis-alist ( definitions -- alist )
[ dup synopsis swap ] { } map>assoc ;
: definitions. ( alist -- )
[ write-object nl ] assoc-each ;
: sorted-definitions. ( definitions -- )
synopsis-alist sort-keys definitions. ;
GENERIC: declarations. ( obj -- ) GENERIC: declarations. ( obj -- )
M: object declarations. drop ; M: object declarations. drop ;
@ -253,7 +268,9 @@ M: builtin-class see-class*
natural-sort [ nl see ] each ; natural-sort [ nl see ] each ;
: see-implementors ( class -- seq ) : see-implementors ( class -- seq )
dup implementors [ 2array ] with map ; dup implementors
[ method method-word ] with map
natural-sort ;
: see-class ( class -- ) : see-class ( class -- )
dup class? [ dup class? [
@ -263,8 +280,9 @@ M: builtin-class see-class*
] when drop ; ] when drop ;
: see-methods ( generic -- seq ) : see-methods ( generic -- seq )
[ "methods" word-prop keys natural-sort ] keep "methods" word-prop
[ 2array ] curry map ; [ nip method-word ] { } assoc>map
natural-sort ;
M: word see M: word see
dup see-class dup see-class

View File

@ -310,13 +310,11 @@ M: immutable-sequence clone-like like ;
<PRIVATE <PRIVATE
: iterate-seq >r dup length swap r> ; inline
: (each) ( seq quot -- n quot' ) : (each) ( seq quot -- n quot' )
iterate-seq [ >r nth-unsafe r> call ] 2curry ; inline >r dup length swap [ nth-unsafe ] curry r> compose ; inline
: (collect) ( quot into -- quot' ) : (collect) ( quot into -- quot' )
[ >r over slip r> set-nth-unsafe ] 2curry ; inline [ >r keep r> set-nth-unsafe ] 2curry ; inline
: collect ( n quot into -- ) : collect ( n quot into -- )
(collect) each-integer ; inline (collect) each-integer ; inline
@ -415,7 +413,7 @@ PRIVATE>
>r dup length 1- swap r> (monotonic) all? ; inline >r dup length 1- swap r> (monotonic) all? ; inline
: interleave ( seq between quot -- ) : interleave ( seq between quot -- )
[ (interleave) ] 2curry iterate-seq 2each ; inline [ (interleave) ] 2curry >r dup length swap r> 2each ; inline
: unfold ( pred quot tail -- seq ) : unfold ( pred quot tail -- seq )
V{ } clone [ V{ } clone [
@ -695,9 +693,9 @@ PRIVATE>
: sequence-hashcode-step ( oldhash newpart -- newhash ) : sequence-hashcode-step ( oldhash newpart -- newhash )
swap [ swap [
dup -2 fixnum-shift >fixnum swap 5 fixnum-shift >fixnum dup -2 fixnum-shift-fast swap 5 fixnum-shift-fast
fixnum+fast fixnum+fast fixnum+fast fixnum+fast
] keep bitxor ; inline ] keep fixnum-bitxor ; inline
: sequence-hashcode ( n seq -- x ) : sequence-hashcode ( n seq -- x )
0 -rot [ 0 -rot [

View File

@ -97,16 +97,8 @@ SYMBOL: file
[ ] [ file get rollback-source-file ] cleanup [ ] [ file get rollback-source-file ] cleanup
] with-scope ; inline ] with-scope ; inline
: smart-usage ( word -- definitions )
\ f or usage [
dup method-body? [
"method" word-prop
{ method-specializer method-generic } get-slots
2array
] when
] map ;
: outside-usages ( seq -- usages ) : outside-usages ( seq -- usages )
dup [ dup [
over smart-usage [ pathname? not ] subset seq-diff over usage
[ dup pathname? not swap where and ] subset seq-diff
] curry { } map>assoc ; ] curry { } map>assoc ;

View File

@ -14,8 +14,7 @@ HELP: later
HELP: cancel-alarm HELP: cancel-alarm
{ $values { "alarm" alarm } } { $values { "alarm" alarm } }
{ $description "Cancels an alarm." } { $description "Cancels an alarm. Does nothing if the alarm is not active." } ;
{ $errors "Throws an error if the alarm is not active." } ;
ARTICLE: "alarms" "Alarms" ARTICLE: "alarms" "Alarms"
"Alarms provide a lightweight way to schedule one-time and recurring tasks without spawning a new thread." "Alarms provide a lightweight way to schedule one-time and recurring tasks without spawning a new thread."

View File

@ -56,15 +56,13 @@ SYMBOL: alarm-thread
: trigger-alarms ( alarms -- ) : trigger-alarms ( alarms -- )
now (trigger-alarms) ; now (trigger-alarms) ;
: next-alarm ( alarms -- ms ) : next-alarm ( alarms -- timestamp/f )
dup heap-empty? dup heap-empty?
[ drop f ] [ drop f ] [ heap-peek drop alarm-time ] if ;
[ heap-peek drop alarm-time now timestamp- 1000 * 0 max ]
if ;
: alarm-thread-loop ( -- ) : alarm-thread-loop ( -- )
alarms get-global alarms get-global
dup next-alarm nap drop dup next-alarm nap-until drop
dup trigger-alarms dup trigger-alarms
alarm-thread-loop ; alarm-thread-loop ;

View File

@ -34,10 +34,10 @@ IN: benchmark.sockets
: socket-benchmarks : socket-benchmarks
10 clients 10 clients
20 clients 20 clients
40 clients 40 clients ;
80 clients ! 80 clients
160 clients ! 160 clients
320 clients ! 320 clients
640 clients ; ! 640 clients ;
MAIN: socket-benchmarks MAIN: socket-benchmarks

2
extra/editors/editors.factor Normal file → Executable file
View File

@ -43,7 +43,7 @@ SYMBOL: edit-hook
: fix ( word -- ) : fix ( word -- )
"Fixing " write dup pprint " and all usages..." print nl "Fixing " write dup pprint " and all usages..." print nl
dup smart-usage swap add* [ dup usage swap add* [
"Editing " write dup . "Editing " write dup .
"RETURN moves on to the next usage, C+d stops." print "RETURN moves on to the next usage, C+d stops." print
flush flush

View File

@ -57,17 +57,9 @@ SYMBOL: validation-errors
] if* ] if*
] with map ; ] with map ;
: expire-sessions ( -- )
sessions get-global
[ nip session-last-seen 20 minutes ago <=> 0 > ]
[ 2drop ] heap-pop-while ;
: lookup-session ( hash -- session ) : lookup-session ( hash -- session )
"furnace-session-id" over at sessions get-global at [ "furnace-session-id" over at get-session
nip [ ] [ new-session "furnace-session-id" roll set-at ] ?if ;
] [
new-session rot "furnace-session-id" swap set-at
] if* ;
: quot>query ( seq action -- hash ) : quot>query ( seq action -- hash )
>r >array r> "action-params" word-prop >r >array r> "action-params" word-prop

51
extra/furnace/sessions/sessions.factor Normal file → Executable file
View File

@ -1,37 +1,48 @@
USING: assoc-heaps assocs calendar crypto.sha2 heaps USING: assocs calendar init kernel math.parser
init kernel math.parser namespaces random ; namespaces random boxes alarms ;
IN: furnace.sessions IN: furnace.sessions
SYMBOL: sessions SYMBOL: sessions
: timeout ( -- dt ) 20 minutes ;
[ [
H{ } clone <min-heap> <assoc-heap> H{ } clone sessions set-global
sessions set-global
] "furnace.sessions" add-init-hook ] "furnace.sessions" add-init-hook
: new-session-id ( -- str ) : new-session-id ( -- str )
4 big-random number>string string>sha-256-string 4 big-random >hex
dup sessions get-global at [ drop new-session-id ] when ; dup sessions get-global key?
[ drop new-session-id ] when ;
TUPLE: session created last-seen user-agent namespace ; TUPLE: session id namespace alarm user-agent ;
M: session <=> ( session1 session2 -- n ) : cancel-timeout ( session -- )
[ session-last-seen ] 2apply <=> ; session-alarm ?box [ cancel-alarm ] [ drop ] if ;
: <session> ( -- obj ) : delete-session ( session -- )
now dup H{ } clone sessions get-global delete-at*
[ set-session-created set-session-last-seen set-session-namespace ] [ cancel-timeout ] [ drop ] if ;
\ session construct ;
: new-session ( -- obj id ) : touch-session ( session -- )
<session> new-session-id [ sessions get-global set-at ] 2keep ; dup cancel-timeout
dup [ session-id delete-session ] curry timeout later
swap session-alarm >box ;
: get-session ( id -- obj/f ) : <session> ( id -- session )
sessions get-global at* [ "no session found 1" throw ] unless ; H{ } clone <box> f session construct-boa ;
! Delete from the assoc only, the heap will timeout : new-session ( -- session id )
: destroy-session ( id -- ) new-session-id [
sessions get-global assoc-heap-assoc delete-at ; dup <session> [
[ sessions get-global set-at ] keep
touch-session
] keep
] keep ;
: get-session ( id -- session/f )
sessions get-global at*
[ dup touch-session ] when ;
: session> ( str -- obj ) : session> ( str -- obj )
session get session-namespace at ; session get session-namespace at ;

2
extra/sequences/next/next.factor Normal file → Executable file
View File

@ -3,6 +3,8 @@ IN: sequences.next
<PRIVATE <PRIVATE
: iterate-seq >r dup length swap r> ; inline
: (map-next) ( i seq quot -- ) : (map-next) ( i seq quot -- )
! this uses O(n) more bounds checks than is really necessary ! this uses O(n) more bounds checks than is really necessary
>r [ >r 1+ r> ?nth ] 2keep nth-unsafe r> call ; inline >r [ >r 1+ r> ?nth ] 2keep nth-unsafe r> call ; inline

View File

@ -28,7 +28,7 @@
! Connection closed by foreign host. ! Connection closed by foreign host.
USING: combinators kernel prettyprint io io.timeouts io.server USING: combinators kernel prettyprint io io.timeouts io.server
sequences namespaces io.sockets continuations ; sequences namespaces io.sockets continuations calendar ;
IN: smtp.server IN: smtp.server
SYMBOL: data-mode SYMBOL: data-mode

6
extra/tools/crossref/crossref-tests.factor Normal file → Executable file
View File

@ -1,5 +1,5 @@
USING: math kernel sequences io.files tools.crossref tools.test USING: math kernel sequences io.files tools.crossref tools.test
parser namespaces source-files ; parser namespaces source-files generic definitions ;
IN: temporary IN: temporary
GENERIC: foo GENERIC: foo
@ -8,5 +8,5 @@ M: integer foo + ;
"resource:extra/tools/test/foo.factor" run-file "resource:extra/tools/test/foo.factor" run-file
[ t ] [ { integer foo } \ + smart-usage member? ] unit-test [ t ] [ integer \ foo method method-word \ + usage member? ] unit-test
[ t ] [ \ foo smart-usage [ pathname? ] contains? ] unit-test [ t ] [ \ foo usage [ pathname? ] contains? ] unit-test

View File

@ -6,14 +6,8 @@ generic tools.completion quotations parser inspector
sorting hashtables vocabs parser source-files ; sorting hashtables vocabs parser source-files ;
IN: tools.crossref IN: tools.crossref
: synopsis-alist ( definitions -- alist )
[ dup synopsis swap ] { } map>assoc ;
: definitions. ( alist -- )
[ write-object nl ] assoc-each ;
: usage. ( word -- ) : usage. ( word -- )
smart-usage synopsis-alist sort-keys definitions. ; usage sorted-definitions. ;
: words-matching ( str -- seq ) : words-matching ( str -- seq )
all-words [ dup word-name ] { } map>assoc completions ; all-words [ dup word-name ] { } map>assoc completions ;

View File

@ -3,8 +3,8 @@
USING: assocs ui.tools.interactor ui.tools.listener USING: assocs ui.tools.interactor ui.tools.listener
ui.tools.workspace help help.topics io.files io.styles kernel ui.tools.workspace help help.topics io.files io.styles kernel
models namespaces prettyprint quotations sequences sorting models namespaces prettyprint quotations sequences sorting
source-files strings tools.completion tools.crossref tuples source-files definitions strings tools.completion tools.crossref
ui.commands ui.gadgets ui.gadgets.editors tuples ui.commands ui.gadgets ui.gadgets.editors
ui.gadgets.lists ui.gadgets.scrollers ui.gadgets.tracks ui.gadgets.lists ui.gadgets.scrollers ui.gadgets.tracks
ui.gestures ui.operations vocabs words vocabs.loader ui.gestures ui.operations vocabs words vocabs.loader
tools.browser unicode.case calendar ; tools.browser unicode.case calendar ;
@ -93,7 +93,7 @@ M: live-search pref-dim* drop { 400 200 } ;
"Words in " rot vocab-name append show-titled-popup ; "Words in " rot vocab-name append show-titled-popup ;
: show-word-usage ( workspace word -- ) : show-word-usage ( workspace word -- )
"" over smart-usage f <definition-search> "" over usage f <definition-search>
"Words and methods using " rot word-name append "Words and methods using " rot word-name append
show-titled-popup ; show-titled-popup ;