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

db4
Eduardo Cavazos 2008-02-26 20:14:20 -06:00
commit c8496a3eff
61 changed files with 834 additions and 608 deletions

View File

@ -23,9 +23,10 @@ $nl
"Two words raise an error in the innermost error handler for the current dynamic extent:" "Two words raise an error in the innermost error handler for the current dynamic extent:"
{ $subsection throw } { $subsection throw }
{ $subsection rethrow } { $subsection rethrow }
"Two words for establishing an error handler:" "Words for establishing an error handler:"
{ $subsection cleanup } { $subsection cleanup }
{ $subsection recover } { $subsection recover }
{ $subsection ignore-errors }
"Unhandled errors are reported in the listener and can be debugged using various tools. See " { $link "debugger" } "." "Unhandled errors are reported in the listener and can be debugged using various tools. See " { $link "debugger" } "."
{ $subsection "errors-restartable" } { $subsection "errors-restartable" }
{ $subsection "errors-post-mortem" } ; { $subsection "errors-post-mortem" } ;
@ -148,6 +149,10 @@ HELP: recover
{ $values { "try" quotation } { "recovery" "a quotation with stack effect " { $snippet "( error -- )" } } } { $values { "try" quotation } { "recovery" "a quotation with stack effect " { $snippet "( error -- )" } } }
{ $description "Calls the " { $snippet "try" } " quotation. If an exception is thrown in the dynamic extent of the " { $snippet "try" } " quotation, restores the data stack and calls the " { $snippet "recovery" } " quotation to handle the error." } ; { $description "Calls the " { $snippet "try" } " quotation. If an exception is thrown in the dynamic extent of the " { $snippet "try" } " quotation, restores the data stack and calls the " { $snippet "recovery" } " quotation to handle the error." } ;
HELP: ignore-errors
{ $values { "try" quotation } }
{ $description "Calls the quotation. If an exception is thrown in the dynamic extent of the quotation, restores the data stack and returns." } ;
HELP: rethrow HELP: rethrow
{ $values { "error" object } } { $values { "error" object } }
{ $description "Throws an error without saving the current continuation in the " { $link error-continuation } " global variable. This is done so that inspecting the error stacks sheds light on the original cause of the exception, rather than the point where it was rethrown." } { $description "Throws an error without saving the current continuation in the " { $link error-continuation } " global variable. This is done so that inspecting the error stacks sheds light on the original cause of the exception, rather than the point where it was rethrown." }

View File

@ -120,6 +120,9 @@ SYMBOL: thread-error-hook
: recover ( try recovery -- ) : recover ( try recovery -- )
>r [ swap >c call c> drop ] curry r> ifcc ; inline >r [ swap >c call c> drop ] curry r> ifcc ; inline
: ignore-errors ( quot -- )
[ drop ] recover ; inline
: cleanup ( try cleanup-always cleanup-error -- ) : cleanup ( try cleanup-always cleanup-error -- )
over >r compose [ dip rethrow ] curry over >r compose [ dip rethrow ] curry
recover r> call ; inline recover r> call ; inline

View File

@ -139,10 +139,6 @@ ARTICLE: "equality" "Equality and comparison testing"
! Defined in handbook.factor ! Defined in handbook.factor
ABOUT: "dataflow" ABOUT: "dataflow"
HELP: version
{ $values { "str" string } }
{ $description "Outputs the version number of the current Factor instance." } ;
HELP: eq? ( obj1 obj2 -- ? ) HELP: eq? ( obj1 obj2 -- ? )
{ $values { "obj1" object } { "obj2" object } { "?" "a boolean" } } { $values { "obj1" object } { "obj2" object } { "?" "a boolean" } }
{ $description "Tests if two references point at the same object." } ; { $description "Tests if two references point at the same object." } ;

View File

@ -3,8 +3,6 @@
USING: kernel.private ; USING: kernel.private ;
IN: kernel IN: kernel
: version ( -- str ) "0.92" ; foldable
! Stack stuff ! Stack stuff
: spin ( x y z -- z y x ) swap rot ; inline : spin ( x y z -- z y x ) swap rot ; inline

View File

@ -1,7 +1,7 @@
! Copyright (C) 2003, 2008 Slava Pestov. ! Copyright (C) 2003, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: arrays hashtables io kernel math memory namespaces USING: arrays hashtables io kernel math math.parser memory
parser sequences strings io.styles io.streams.lines namespaces parser sequences strings io.styles io.streams.lines
io.streams.duplex vectors words generic system combinators io.streams.duplex vectors words generic system combinators
tuples continuations debugger definitions compiler.units ; tuples continuations debugger definitions compiler.units ;
IN: listener IN: listener
@ -63,7 +63,7 @@ M: duplex-stream stream-read-quot
[ listen until-quit ] if ; inline [ listen until-quit ] if ; inline
: print-banner ( -- ) : print-banner ( -- )
"Factor " write version write "Factor #" write build number>string write
" on " write os write "/" write cpu print ; " on " write os write "/" write cpu print ;
: listener ( -- ) : listener ( -- )

View File

@ -17,6 +17,11 @@ MATH: <= ( x y -- ? ) foldable
MATH: > ( x y -- ? ) foldable MATH: > ( x y -- ? ) foldable
MATH: >= ( x y -- ? ) foldable MATH: >= ( x y -- ? ) foldable
: after? ( obj1 obj2 -- ? ) <=> 0 > ; inline
: before? ( obj1 obj2 -- ? ) <=> 0 < ; inline
: after=? ( obj1 obj2 -- ? ) <=> 0 >= ; inline
: before=? ( obj1 obj2 -- ? ) <=> 0 <= ; inline
MATH: + ( x y -- z ) foldable MATH: + ( x y -- z ) foldable
MATH: - ( x y -- z ) foldable MATH: - ( x y -- z ) foldable
MATH: * ( x y -- z ) foldable MATH: * ( x y -- z ) foldable

View File

@ -352,6 +352,8 @@ TUPLE: bad-number ;
: parse-definition ( -- quot ) : parse-definition ( -- quot )
\ ; parse-until >quotation ; \ ; parse-until >quotation ;
: (:) CREATE dup reset-generic parse-definition ;
GENERIC: expected>string ( obj -- str ) GENERIC: expected>string ( obj -- str )
M: f expected>string drop "end of input" ; M: f expected>string drop "end of input" ;

2
core/sorting/sorting-tests.factor Normal file → Executable file
View File

@ -11,7 +11,7 @@ unit-test
[ t ] [ [ t ] [
100 [ 100 [
drop drop
100 [ drop 20 random [ drop 1000 random ] map ] map natural-sort [ <=> 0 <= ] monotonic? 100 [ drop 20 random [ drop 1000 random ] map ] map natural-sort [ before=? ] monotonic?
] all? ] all?
] unit-test ] unit-test

View File

@ -52,7 +52,7 @@ PRIVATE>
: sort-values ( seq -- sortedseq ) [ [ second ] compare ] sort ; : sort-values ( seq -- sortedseq ) [ [ second ] compare ] sort ;
: sort-pair ( a b -- c d ) 2dup <=> 0 > [ swap ] when ; : sort-pair ( a b -- c d ) 2dup after? [ swap ] when ;
: midpoint ( seq -- elt ) : midpoint ( seq -- elt )
[ midpoint@ ] keep nth-unsafe ; inline [ midpoint@ ] keep nth-unsafe ; inline

View File

@ -28,8 +28,8 @@ IN: temporary
[ "end" ] [ "Beginning and end" 14 tail ] unit-test [ "end" ] [ "Beginning and end" 14 tail ] unit-test
[ t ] [ "abc" "abd" <=> 0 < ] unit-test [ t ] [ "abc" "abd" before? ] unit-test
[ t ] [ "z" "abd" <=> 0 > ] unit-test [ t ] [ "z" "abd" after? ] unit-test
[ 0 10 "hello" subseq ] must-fail [ 0 10 "hello" subseq ] must-fail

View File

@ -107,7 +107,7 @@ IN: bootstrap.syntax
] define-syntax ] define-syntax
":" [ ":" [
CREATE dup reset-generic parse-definition define (:) define
] define-syntax ] define-syntax
"GENERIC:" [ "GENERIC:" [

View File

@ -5,11 +5,11 @@ HELP: alarm
{ $class-description "An alarm. Cancel passed to " { $link cancel-alarm } "." } ; { $class-description "An alarm. Cancel passed to " { $link cancel-alarm } "." } ;
HELP: add-alarm HELP: add-alarm
{ $values { "quot" quotation } { "time" timestamp } { "frequency" "a " { $link dt } " or " { $link f } } { "alarm" alarm } } { $values { "quot" quotation } { "time" timestamp } { "frequency" "a " { $link duration } " or " { $link f } } { "alarm" alarm } }
{ $description "Creates and registers an alarm. If " { $snippet "frequency" } " is " { $link f } ", this will be a one-time alarm, otherwise it will fire with the given frequency. The quotation will be called from the alarm thread." } ; { $description "Creates and registers an alarm. If " { $snippet "frequency" } " is " { $link f } ", this will be a one-time alarm, otherwise it will fire with the given frequency. The quotation will be called from the alarm thread." } ;
HELP: later HELP: later
{ $values { "quot" quotation } { "time" dt } { "alarm" alarm } } { $values { "quot" quotation } { "time" duration } { "alarm" alarm } }
{ $description "Creates and registers an alarm which calls the quotation once at " { $snippet "time" } { $link from-now } "." } ; { $description "Creates and registers an alarm which calls the quotation once at " { $snippet "time" } { $link from-now } "." } ;
HELP: cancel-alarm HELP: cancel-alarm

View File

@ -16,7 +16,7 @@ SYMBOL: alarm-thread
alarm-thread get-global interrupt ; alarm-thread get-global interrupt ;
: check-alarm : check-alarm
dup dt? over not or [ "Not a dt" throw ] unless dup duration? over not or [ "Not a duration" throw ] unless
over timestamp? [ "Not a timestamp" throw ] unless over timestamp? [ "Not a timestamp" throw ] unless
pick callable? [ "Not a quotation" throw ] unless ; inline pick callable? [ "Not a quotation" throw ] unless ; inline
@ -29,10 +29,10 @@ SYMBOL: alarm-thread
notify-alarm-thread ; notify-alarm-thread ;
: alarm-expired? ( alarm now -- ? ) : alarm-expired? ( alarm now -- ? )
>r alarm-time r> <=> 0 <= ; >r alarm-time r> before=? ;
: reschedule-alarm ( alarm -- ) : reschedule-alarm ( alarm -- )
dup alarm-time over alarm-interval +dt dup alarm-time over alarm-interval time+
over set-alarm-time over set-alarm-time
register-alarm ; register-alarm ;

View File

@ -51,7 +51,7 @@ HINTS: random fixnum ;
dup keys >byte-array dup keys >byte-array
swap values >float-array unclip [ + ] accumulate swap add ; swap values >float-array unclip [ + ] accumulate swap add ;
:: select-random | seed chars floats | :: select-random ( seed chars floats -- elt )
floats seed random -rot floats seed random -rot
[ >= ] curry find drop [ >= ] curry find drop
chars nth-unsafe ; inline chars nth-unsafe ; inline
@ -62,7 +62,7 @@ HINTS: random fixnum ;
: write-description ( desc id -- ) : write-description ( desc id -- )
">" write write bl print ; inline ">" write write bl print ; inline
:: split-lines | n quot | :: split-lines ( n quot -- )
n line-length /mod n line-length /mod
[ [ line-length quot call ] times ] dip [ [ line-length quot call ] times ] dip
dup zero? [ drop ] quot if ; inline dup zero? [ drop ] quot if ; inline
@ -71,7 +71,7 @@ HINTS: random fixnum ;
write-description write-description
[ make-random-fasta ] 2curry split-lines ; inline [ make-random-fasta ] 2curry split-lines ; inline
:: make-repeat-fasta | k len alu | :: make-repeat-fasta ( k len alu -- )
[let | kn [ alu length ] | [let | kn [ alu length ] |
len [ k + kn mod alu nth-unsafe ] B{ } map-as print len [ k + kn mod alu nth-unsafe ] B{ } map-as print
k len + k len +

View File

@ -6,16 +6,20 @@ bootstrap.image sequences io namespaces io.launcher math ;
: destination "slava@factorcode.org:www/images/latest/" ; : destination "slava@factorcode.org:www/images/latest/" ;
: checksums "checksums.txt" temp-file ;
: boot-image-names images [ boot-image-name ] map ; : boot-image-names images [ boot-image-name ] map ;
: compute-checksums ( -- ) : compute-checksums ( -- )
"checksums.txt" [ checksums [
boot-image-names [ dup write bl file>md5str print ] each boot-image-names [ dup write bl file>md5str print ] each
] with-file-writer ; ] with-file-writer ;
: upload-images ( -- ) : upload-images ( -- )
[ [
"scp" , boot-image-names % "checksums.txt" , destination , "scp" ,
boot-image-names %
"temp/checksums.txt" , destination ,
] { } make try-process ; ] { } make try-process ;
: new-images ( -- ) : new-images ( -- )

View File

@ -39,12 +39,12 @@ IN: bunny.model
[ normals ] 2keep 3array [ normals ] 2keep 3array
] time ; ] time ;
: model-path "bun_zipper.ply" ; : model-path "bun_zipper.ply" temp-file ;
: model-url "http://factorcode.org/bun_zipper.ply" ; : model-url "http://factorcode.org/bun_zipper.ply" ;
: maybe-download ( -- path ) : maybe-download ( -- path )
model-path resource-path dup exists? [ model-path dup exists? [
"Downloading bunny from " write "Downloading bunny from " write
model-url dup print flush model-url dup print flush
over download-to over download-to

View File

@ -1,14 +1,15 @@
USING: arrays calendar kernel math sequences tools.test USING: arrays calendar kernel math sequences tools.test
continuations system io.streams.string ; continuations system ;
[ 2004 12 32 0 0 0 0 make-timestamp ] [ "invalid timestamp" = ] must-fail-with [ f ] [ 2004 12 32 0 0 0 0 <timestamp> valid-timestamp? ] unit-test
[ 2004 2 30 0 0 0 0 make-timestamp ] [ "invalid timestamp" = ] must-fail-with [ f ] [ 2004 2 30 0 0 0 0 <timestamp> valid-timestamp? ] unit-test
[ 2003 2 29 0 0 0 0 make-timestamp ] [ "invalid timestamp" = ] must-fail-with [ f ] [ 2003 2 29 0 0 0 0 <timestamp> valid-timestamp? ] unit-test
[ 2004 -2 9 0 0 0 0 make-timestamp ] [ "invalid timestamp" = ] must-fail-with [ f ] [ 2004 -2 9 0 0 0 0 <timestamp> valid-timestamp? ] unit-test
[ 2004 12 0 0 0 0 0 make-timestamp ] [ "invalid timestamp" = ] must-fail-with [ f ] [ 2004 12 0 0 0 0 0 <timestamp> valid-timestamp? ] unit-test
[ 2004 12 1 24 0 0 0 make-timestamp ] [ "invalid timestamp" = ] must-fail-with [ f ] [ 2004 12 1 24 0 0 0 <timestamp> valid-timestamp? ] unit-test
[ 2004 12 1 23 60 0 0 make-timestamp ] [ "invalid timestamp" = ] must-fail-with [ f ] [ 2004 12 1 23 60 0 0 <timestamp> valid-timestamp? ] unit-test
[ 2004 12 1 23 59 60 0 make-timestamp ] [ "invalid timestamp" = ] must-fail-with [ f ] [ 2004 12 1 23 59 60 0 <timestamp> valid-timestamp? ] unit-test
[ t ] [ now valid-timestamp? ] unit-test
[ f ] [ 1900 leap-year? ] unit-test [ f ] [ 1900 leap-year? ] unit-test
[ t ] [ 1904 leap-year? ] unit-test [ t ] [ 1904 leap-year? ] unit-test
@ -16,148 +17,144 @@ continuations system io.streams.string ;
[ f ] [ 2001 leap-year? ] unit-test [ f ] [ 2001 leap-year? ] unit-test
[ f ] [ 2006 leap-year? ] unit-test [ f ] [ 2006 leap-year? ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp 1 seconds +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> 1 seconds time+
2006 10 10 0 0 1 0 make-timestamp = ] unit-test 2006 10 10 0 0 1 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp 100 seconds +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> 100 seconds time+
2006 10 10 0 1 40 0 make-timestamp = ] unit-test 2006 10 10 0 1 40 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp -100 seconds +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> -100 seconds time+
2006 10 9 23 58 20 0 make-timestamp = ] unit-test 2006 10 9 23 58 20 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp 86400 seconds +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> 86400 seconds time+
2006 10 11 0 0 0 0 make-timestamp = ] unit-test 2006 10 11 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp 10 minutes +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> 10 minutes time+
2006 10 10 0 10 0 0 make-timestamp = ] unit-test 2006 10 10 0 10 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp 10.5 minutes +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> 10.5 minutes time+
2006 10 10 0 10 30 0 make-timestamp = ] unit-test 2006 10 10 0 10 30 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp 3/4 minutes +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> 3/4 minutes time+
2006 10 10 0 0 45 0 make-timestamp = ] unit-test 2006 10 10 0 0 45 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp -3/4 minutes +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> -3/4 minutes time+
2006 10 9 23 59 15 0 make-timestamp = ] unit-test 2006 10 9 23 59 15 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp 7200 minutes +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> 7200 minutes time+
2006 10 15 0 0 0 0 make-timestamp = ] unit-test 2006 10 15 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp -10 minutes +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> -10 minutes time+
2006 10 9 23 50 0 0 make-timestamp = ] unit-test 2006 10 9 23 50 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 10 10 0 0 0 0 make-timestamp -100 minutes +dt [ t ] [ 2006 10 10 0 0 0 0 <timestamp> -100 minutes time+
2006 10 9 22 20 0 0 make-timestamp = ] unit-test 2006 10 9 22 20 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 1 hours +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 1 hours time+
2006 1 1 1 0 0 0 make-timestamp = ] unit-test 2006 1 1 1 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 24 hours +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 24 hours time+
2006 1 2 0 0 0 0 make-timestamp = ] unit-test 2006 1 2 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -24 hours +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -24 hours time+
2005 12 31 0 0 0 0 make-timestamp = ] unit-test 2005 12 31 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 12 hours +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 12 hours time+
2006 1 1 12 0 0 0 make-timestamp = ] unit-test 2006 1 1 12 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 72 hours +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 72 hours time+
2006 1 4 0 0 0 0 make-timestamp = ] unit-test 2006 1 4 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 1 days +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 1 days time+
2006 1 2 0 0 0 0 make-timestamp = ] unit-test 2006 1 2 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -1 days +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -1 days time+
2005 12 31 0 0 0 0 make-timestamp = ] unit-test 2005 12 31 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 365 days +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 365 days time+
2007 1 1 0 0 0 0 make-timestamp = ] unit-test 2007 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -365 days +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -365 days time+
2005 1 1 0 0 0 0 make-timestamp = ] unit-test 2005 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2004 1 1 0 0 0 0 make-timestamp 365 days +dt [ t ] [ 2004 1 1 0 0 0 0 <timestamp> 365 days time+
2004 12 31 0 0 0 0 make-timestamp = ] unit-test 2004 12 31 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2004 1 1 0 0 0 0 make-timestamp 366 days +dt [ t ] [ 2004 1 1 0 0 0 0 <timestamp> 366 days time+
2005 1 1 0 0 0 0 make-timestamp = ] unit-test 2005 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 11 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 11 months time+
2006 12 1 0 0 0 0 make-timestamp = ] unit-test 2006 12 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 12 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 12 months time+
2007 1 1 0 0 0 0 make-timestamp = ] unit-test 2007 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 24 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 24 months time+
2008 1 1 0 0 0 0 make-timestamp = ] unit-test 2008 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 13 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 13 months time+
2007 2 1 0 0 0 0 make-timestamp = ] unit-test 2007 2 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 1 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 1 months time+
2006 2 1 0 0 0 0 make-timestamp = ] unit-test 2006 2 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 0 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 0 months time+
2006 1 1 0 0 0 0 make-timestamp = ] unit-test 2006 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -1 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -1 months time+
2005 12 1 0 0 0 0 make-timestamp = ] unit-test 2005 12 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -2 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -2 months time+
2005 11 1 0 0 0 0 make-timestamp = ] unit-test 2005 11 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -13 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -13 months time+
2004 12 1 0 0 0 0 make-timestamp = ] unit-test 2004 12 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -24 months +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -24 months time+
2004 1 1 0 0 0 0 make-timestamp = ] unit-test 2004 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2004 2 29 0 0 0 0 make-timestamp 12 months +dt [ t ] [ 2004 2 29 0 0 0 0 <timestamp> 12 months time+
2005 3 1 0 0 0 0 make-timestamp = ] unit-test 2005 3 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2004 2 29 0 0 0 0 make-timestamp -12 months +dt [ t ] [ 2004 2 29 0 0 0 0 <timestamp> -12 months time+
2003 3 1 0 0 0 0 make-timestamp = ] unit-test 2003 3 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 0 years +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 0 years time+
2006 1 1 0 0 0 0 make-timestamp = ] unit-test 2006 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp 1 years +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> 1 years time+
2007 1 1 0 0 0 0 make-timestamp = ] unit-test 2007 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -1 years +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -1 years time+
2005 1 1 0 0 0 0 make-timestamp = ] unit-test 2005 1 1 0 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2006 1 1 0 0 0 0 make-timestamp -100 years +dt [ t ] [ 2006 1 1 0 0 0 0 <timestamp> -100 years time+
1906 1 1 0 0 0 0 make-timestamp = ] unit-test 1906 1 1 0 0 0 0 <timestamp> = ] unit-test
! [ t ] [ 2004 2 29 0 0 0 0 make-timestamp -1 years +dt ! [ t ] [ 2004 2 29 0 0 0 0 <timestamp> -1 years time+
! 2003 2 28 0 0 0 0 make-timestamp = ] unit-test ! 2003 2 28 0 0 0 0 <timestamp> = ] unit-test
[ 5 ] [ 2006 7 14 0 0 0 0 make-timestamp day-of-week ] unit-test [ 5 ] [ 2006 7 14 0 0 0 0 <timestamp> day-of-week ] unit-test
[ t ] [ 2006 7 14 [ julian-day-number julian-day-number>date 0 0 0 0 make-timestamp ] 3keep 0 0 0 0 make-timestamp = ] unit-test [ t ] [ 2006 7 14 [ julian-day-number julian-day-number>date 0 0 0 0 <timestamp> ] 3keep 0 0 0 0 <timestamp> = ] unit-test
[ 1 ] [ 2006 1 1 0 0 0 0 make-timestamp day-of-year ] unit-test [ 1 ] [ 2006 1 1 0 0 0 0 <timestamp> day-of-year ] unit-test
[ 60 ] [ 2004 2 29 0 0 0 0 make-timestamp day-of-year ] unit-test [ 60 ] [ 2004 2 29 0 0 0 0 <timestamp> day-of-year ] unit-test
[ 61 ] [ 2004 3 1 0 0 0 0 make-timestamp day-of-year ] unit-test [ 61 ] [ 2004 3 1 0 0 0 0 <timestamp> day-of-year ] unit-test
[ 366 ] [ 2004 12 31 0 0 0 0 make-timestamp day-of-year ] unit-test [ 366 ] [ 2004 12 31 0 0 0 0 <timestamp> day-of-year ] unit-test
[ 365 ] [ 2003 12 31 0 0 0 0 make-timestamp day-of-year ] unit-test [ 365 ] [ 2003 12 31 0 0 0 0 <timestamp> day-of-year ] unit-test
[ 60 ] [ 2003 3 1 0 0 0 0 make-timestamp day-of-year ] unit-test [ 60 ] [ 2003 3 1 0 0 0 0 <timestamp> day-of-year ] unit-test
[ t ] [ 2004 12 31 0 0 0 0 make-timestamp dup = ] unit-test [ t ] [ 2004 12 31 0 0 0 0 <timestamp> dup = ] unit-test
[ t ] [ 2004 1 1 0 0 0 0 make-timestamp 10 seconds 5 years +dts +dt [ t ] [ 2004 1 1 0 0 0 0 <timestamp> 10 seconds 5 years time+ time+
2009 1 1 0 0 10 0 make-timestamp = ] unit-test 2009 1 1 0 0 10 0 <timestamp> = ] unit-test
[ t ] [ 2004 1 1 0 0 0 0 make-timestamp -10 seconds -5 years +dts +dt [ t ] [ 2004 1 1 0 0 0 0 <timestamp> -10 seconds -5 years time+ time+
1998 12 31 23 59 50 0 make-timestamp = ] unit-test 1998 12 31 23 59 50 0 <timestamp> = ] unit-test
[ t ] [ 2004 1 1 23 0 0 12 make-timestamp 0 convert-timezone [ t ] [ 2004 1 1 23 0 0 12 <timestamp> 0 convert-timezone
2004 1 1 11 0 0 0 make-timestamp = ] unit-test 2004 1 1 11 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2004 1 1 5 0 0 -11 make-timestamp 0 convert-timezone [ t ] [ 2004 1 1 5 0 0 -11 <timestamp> 0 convert-timezone
2004 1 1 16 0 0 0 make-timestamp = ] unit-test 2004 1 1 16 0 0 0 <timestamp> = ] unit-test
[ t ] [ 2004 1 1 23 0 0 9.5 make-timestamp 0 convert-timezone [ t ] [ 2004 1 1 23 0 0 9+1/2 <timestamp> 0 convert-timezone
2004 1 1 13 30 0 0 make-timestamp = ] unit-test 2004 1 1 13 30 0 0 <timestamp> = ] unit-test
[ 0 ] [ 2004 1 1 13 30 0 0 make-timestamp [ 0 ] [ 2004 1 1 13 30 0 0 <timestamp>
2004 1 1 12 30 0 -1 make-timestamp <=> ] unit-test 2004 1 1 12 30 0 -1 <timestamp> <=> ] unit-test
[ 1 ] [ 2004 1 1 13 30 0 0 make-timestamp [ 1 ] [ 2004 1 1 13 30 0 0 <timestamp>
2004 1 1 12 30 0 0 make-timestamp <=> ] unit-test 2004 1 1 12 30 0 0 <timestamp> <=> ] unit-test
[ -1 ] [ 2004 1 1 12 30 0 0 make-timestamp [ -1 ] [ 2004 1 1 12 30 0 0 <timestamp>
2004 1 1 13 30 0 0 make-timestamp <=> ] unit-test 2004 1 1 13 30 0 0 <timestamp> <=> ] unit-test
[ 1 ] [ 2005 1 1 12 30 0 0 make-timestamp [ 1 ] [ 2005 1 1 12 30 0 0 <timestamp>
2004 1 1 13 30 0 0 make-timestamp <=> ] unit-test 2004 1 1 13 30 0 0 <timestamp> <=> ] unit-test
[ t ] [ now timestamp>unix-time millis 1000 /f - 10 < ] unit-test [ t ] [ now timestamp>millis millis - 1000 < ] unit-test
[ t ] [ 0 unix-time>timestamp unix-1970 = ] unit-test [ t ] [ 0 millis>timestamp unix-1970 = ] unit-test
[ t ] [ 123456789 [ unix-time>timestamp timestamp>unix-time ] keep = ] unit-test [ t ] [ 123456789000 [ millis>timestamp timestamp>millis ] keep = ] unit-test
[ t ] [ 123456789123456789 [ unix-time>timestamp timestamp>unix-time ] keep = ] unit-test [ t ] [ 123456789123456 [ millis>timestamp timestamp>millis ] keep = ] unit-test
[ 0 ] [ : checktime+ now dup clone [ rot time+ drop ] keep = ;
"Z" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test
[ 1 ] [ [ t ] [ 5 seconds checktime+ ] unit-test
"+01" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test
[ -1 ] [ [ t ] [ 5 minutes checktime+ ] unit-test
"-01" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test
[ -1-1/2 ] [ [ t ] [ 5 hours checktime+ ] unit-test
"-01:30" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test
[ 1+1/2 ] [ [ t ] [ 5 days checktime+ ] unit-test
"+01:30" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test [ t ] [ 5 weeks checktime+ ] unit-test
[ t ] [ 5 months checktime+ ] unit-test
[ t ] [ 5 years checktime+ ] unit-test

View File

@ -1,20 +1,21 @@
! Copyright (C) 2007 Doug Coleman. ! Copyright (C) 2007 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: arrays hashtables io io.streams.string kernel math USING: arrays kernel math math.functions namespaces sequences
math.vectors math.functions math.parser namespaces sequences strings tuples system vocabs.loader calendar.backend threads
strings tuples system debugger combinators vocabs.loader new-slots accessors combinators ;
calendar.backend structs alien.c-types math.vectors
shuffle threads ;
IN: calendar IN: calendar
TUPLE: timestamp year month day hour minute second gmt-offset ; TUPLE: timestamp year month day hour minute second gmt-offset ;
C: <timestamp> timestamp C: <timestamp> timestamp
TUPLE: dt year month day hour minute second ; : <date> ( year month day -- timestamp )
0 0 0 gmt-offset <timestamp> ;
C: <dt> dt TUPLE: duration year month day hour minute second ;
C: <duration> duration
: month-names : month-names
{ {
@ -36,9 +37,14 @@ C: <dt> dt
: day-abbreviations2 { "Su" "Mo" "Tu" "We" "Th" "Fr" "Sa" } ; : day-abbreviations2 { "Su" "Mo" "Tu" "We" "Th" "Fr" "Sa" } ;
: day-abbreviations3 { "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" } ; : day-abbreviations3 { "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" } ;
: average-month ( -- x ) : average-month 30+5/12 ; inline
#! length of average month in days : months-per-year 12 ; inline
30.41666666666667 ; : days-per-year 3652425/10000 ; inline
: hours-per-year 876582/100 ; inline
: minutes-per-year 5259492/10 ; inline
: seconds-per-year 31556952 ; inline
<PRIVATE
SYMBOL: a SYMBOL: a
SYMBOL: b SYMBOL: b
@ -48,6 +54,8 @@ SYMBOL: e
SYMBOL: y SYMBOL: y
SYMBOL: m SYMBOL: m
PRIVATE>
: julian-day-number ( year month day -- n ) : julian-day-number ( year month day -- n )
#! Returns a composite date number #! Returns a composite date number
#! Not valid before year -4800 #! Not valid before year -4800
@ -74,38 +82,31 @@ SYMBOL: m
e get 153 m get * 2 + 5 /i - 1+ e get 153 m get * 2 + 5 /i - 1+
] with-scope ; ] with-scope ;
: set-date ( year month day timestamp -- )
[ set-timestamp-day ] keep
[ set-timestamp-month ] keep
set-timestamp-year ;
: set-time ( hour minute second timestamp -- )
[ set-timestamp-second ] keep
[ set-timestamp-minute ] keep
set-timestamp-hour ;
: >date< ( timestamp -- year month day ) : >date< ( timestamp -- year month day )
[ timestamp-year ] keep { year>> month>> day>> } get-slots ;
[ timestamp-month ] keep
timestamp-day ;
: >time< ( timestamp -- hour minute second ) : >time< ( timestamp -- hour minute second )
[ timestamp-hour ] keep { hour>> minute>> second>> } get-slots ;
[ timestamp-minute ] keep
timestamp-second ;
: zero-dt ( -- <dt> ) 0 0 0 0 0 0 <dt> ; : instant ( -- dt ) 0 0 0 0 0 0 <duration> ;
: years ( n -- dt ) zero-dt [ set-dt-year ] keep ; : years ( n -- dt ) instant swap >>year ;
: months ( n -- dt ) zero-dt [ set-dt-month ] keep ; : months ( n -- dt ) instant swap >>month ;
: days ( n -- dt ) zero-dt [ set-dt-day ] keep ; : days ( n -- dt ) instant swap >>day ;
: weeks ( n -- dt ) 7 * days ; : weeks ( n -- dt ) 7 * days ;
: hours ( n -- dt ) zero-dt [ set-dt-hour ] keep ; : hours ( n -- dt ) instant swap >>hour ;
: minutes ( n -- dt ) zero-dt [ set-dt-minute ] keep ; : minutes ( n -- dt ) instant swap >>minute ;
: seconds ( n -- dt ) zero-dt [ set-dt-second ] keep ; : seconds ( n -- dt ) instant swap >>second ;
: milliseconds ( n -- dt ) 1000 /f seconds ; : milliseconds ( n -- dt ) 1000 / seconds ;
: julian-day-number>timestamp ( n -- timestamp ) GENERIC: leap-year? ( obj -- ? )
julian-day-number>date 0 0 0 0 <timestamp> ;
M: integer leap-year? ( year -- ? )
dup 100 mod zero? 400 4 ? mod zero? ;
M: timestamp leap-year? ( timestamp -- ? )
year>> leap-year? ;
<PRIVATE
GENERIC: +year ( timestamp x -- timestamp ) GENERIC: +year ( timestamp x -- timestamp )
GENERIC: +month ( timestamp x -- timestamp ) GENERIC: +month ( timestamp x -- timestamp )
@ -116,96 +117,119 @@ GENERIC: +second ( timestamp x -- timestamp )
: /rem ( f n -- q r ) : /rem ( f n -- q r )
#! q is positive or negative, r is positive from 0 <= r < n #! q is positive or negative, r is positive from 0 <= r < n
[ /f floor >integer ] 2keep rem ; [ / floor >integer ] 2keep rem ;
: float>whole-part ( float -- int float ) : float>whole-part ( float -- int float )
[ floor >integer ] keep over - ; [ floor >integer ] keep over - ;
GENERIC: leap-year? ( obj -- ? )
M: integer leap-year? ( year -- ? )
dup 100 mod zero? 400 4 ? mod zero? ;
M: timestamp leap-year? ( timestamp -- ? )
timestamp-year leap-year? ;
: adjust-leap-year ( timestamp -- timestamp ) : adjust-leap-year ( timestamp -- timestamp )
dup >date< 29 = swap 2 = and swap leap-year? not and [ dup day>> 29 = over month>> 2 = pick leap-year? not and and
dup >r timestamp-year 3 1 r> [ set-date ] keep [ 3 >>month 1 >>day ] when ;
] when ;
: unless-zero >r dup zero? [ drop ] r> if ; inline
M: integer +year ( timestamp n -- timestamp ) M: integer +year ( timestamp n -- timestamp )
over timestamp-year + swap [ set-timestamp-year ] keep [ [ + ] curry change-year adjust-leap-year ] unless-zero ;
adjust-leap-year ;
M: real +year ( timestamp n -- timestamp ) M: real +year ( timestamp n -- timestamp )
float>whole-part rot swap 365.2425 * +day swap +year ; [ float>whole-part swapd days-per-year * +day swap +year ] unless-zero ;
: months/years ( n -- months years )
12 /rem dup zero? [ drop 1- 12 ] when swap ; inline
M: integer +month ( timestamp n -- timestamp ) M: integer +month ( timestamp n -- timestamp )
over timestamp-month + 12 /rem [ over month>> + months/years >r >>month r> +year ] unless-zero ;
dup zero? [ drop 12 >r 1- r> ] when pick set-timestamp-month
+year ;
M: real +month ( timestamp n -- timestamp ) M: real +month ( timestamp n -- timestamp )
float>whole-part rot swap average-month * +day swap +month ; [ float>whole-part swapd average-month * +day swap +month ] unless-zero ;
M: integer +day ( timestamp n -- timestamp ) M: integer +day ( timestamp n -- timestamp )
swap [ [
>date< julian-day-number + julian-day-number>timestamp over >date< julian-day-number + julian-day-number>date
] keep swap >r >time< r> [ set-time ] keep ; >r >r >>year r> >>month r> >>day
] unless-zero ;
M: real +day ( timestamp n -- timestamp ) M: real +day ( timestamp n -- timestamp )
float>whole-part rot swap 24 * +hour swap +day ; [ float>whole-part swapd 24 * +hour swap +day ] unless-zero ;
: hours/days ( n -- hours days )
24 /rem swap ;
M: integer +hour ( timestamp n -- timestamp ) M: integer +hour ( timestamp n -- timestamp )
over timestamp-hour + 24 /rem pick set-timestamp-hour [ over hour>> + hours/days >r >>hour r> +day ] unless-zero ;
+day ;
M: real +hour ( timestamp n -- timestamp ) M: real +hour ( timestamp n -- timestamp )
float>whole-part rot swap 60 * +minute swap +hour ; float>whole-part swapd 60 * +minute swap +hour ;
: minutes/hours ( n -- minutes hours )
60 /rem swap ;
M: integer +minute ( timestamp n -- timestamp ) M: integer +minute ( timestamp n -- timestamp )
over timestamp-minute + 60 /rem pick [ over minute>> + minutes/hours >r >>minute r> +hour ] unless-zero ;
set-timestamp-minute +hour ;
M: real +minute ( timestamp n -- timestamp ) M: real +minute ( timestamp n -- timestamp )
float>whole-part rot swap 60 * +second swap +minute ; [ float>whole-part swapd 60 * +second swap +minute ] unless-zero ;
: seconds/minutes ( n -- seconds minutes )
60 /rem swap >integer ;
M: number +second ( timestamp n -- timestamp ) M: number +second ( timestamp n -- timestamp )
over timestamp-second + 60 /rem >r >integer r> [ over second>> + seconds/minutes >r >>second r> +minute ] unless-zero ;
pick set-timestamp-second +minute ;
: +dt ( timestamp dt -- timestamp ) : (time+)
dupd [ second>> +second ] keep
[ dt-second +second ] keep [ minute>> +minute ] keep
[ dt-minute +minute ] keep [ hour>> +hour ] keep
[ dt-hour +hour ] keep [ day>> +day ] keep
[ dt-day +day ] keep [ month>> +month ] keep
[ dt-month +month ] keep [ year>> +year ] keep ; inline
dt-year +year
swap timestamp-gmt-offset over set-timestamp-gmt-offset ;
: make-timestamp ( year month day hour minute second gmt-offset -- timestamp ) : +slots [ 2apply + ] curry 2keep ; inline
<timestamp> [ 0 seconds +dt ] keep
[ = [ "invalid timestamp" throw ] unless ] keep ;
: make-date ( year month day -- timestamp ) PRIVATE>
0 0 0 gmt-offset make-timestamp ;
: array>dt ( vec -- dt ) { dt f } swap append >tuple ; GENERIC# time+ 1 ( time dt -- time )
: +dts ( dt dt -- dt ) [ tuple-slots ] 2apply v+ array>dt ;
M: timestamp time+
>r clone r> (time+) drop ;
M: duration time+
dup timestamp? [
swap time+
] [
[ year>> ] +slots
[ month>> ] +slots
[ day>> ] +slots
[ hour>> ] +slots
[ minute>> ] +slots
[ second>> ] +slots
2drop <duration>
] if ;
: dt>years ( dt -- x ) : dt>years ( dt -- x )
#! Uses average month/year length since dt loses calendar #! Uses average month/year length since dt loses calendar
#! data #! data
tuple-slots 0 swap
{ 1 12 365.2425 8765.82 525949.2 31556952.0 } [ year>> + ] keep
v/ sum ; [ month>> months-per-year / + ] keep
[ day>> days-per-year / + ] keep
[ hour>> hours-per-year / + ] keep
[ minute>> minutes-per-year / + ] keep
second>> seconds-per-year / + ;
: dt>months ( dt -- x ) dt>years 12 * ; M: duration <=> [ dt>years ] compare ;
: dt>days ( dt -- x ) dt>years 365.2425 * ;
: dt>hours ( dt -- x ) dt>years 8765.82 * ; : dt>months ( dt -- x ) dt>years months-per-year * ;
: dt>minutes ( dt -- x ) dt>years 525949.2 * ; : dt>days ( dt -- x ) dt>years days-per-year * ;
: dt>seconds ( dt -- x ) dt>years 31556952 * ; : dt>hours ( dt -- x ) dt>years hours-per-year * ;
: dt>milliseconds ( dt -- x ) dt>years 31556952000 * ; : dt>minutes ( dt -- x ) dt>years minutes-per-year * ;
: dt>seconds ( dt -- x ) dt>years seconds-per-year * ;
: dt>milliseconds ( dt -- x ) dt>seconds 1000 * ;
: convert-timezone ( timestamp n -- timestamp ) : convert-timezone ( timestamp n -- timestamp )
[ over timestamp-gmt-offset - hours +dt ] keep over gmt-offset>> over = [ drop ] [
over set-timestamp-gmt-offset ; [ over gmt-offset>> - hours time+ ] keep >>gmt-offset
] if ;
: >local-time ( timestamp -- timestamp ) : >local-time ( timestamp -- timestamp )
gmt-offset convert-timezone ; gmt-offset convert-timezone ;
@ -216,45 +240,54 @@ M: number +second ( timestamp n -- timestamp )
M: timestamp <=> ( ts1 ts2 -- n ) M: timestamp <=> ( ts1 ts2 -- n )
[ >gmt tuple-slots ] compare ; [ >gmt tuple-slots ] compare ;
: timestamp- ( timestamp timestamp -- seconds ) : (time-) ( timestamp timestamp -- n )
#! Exact calendar-time difference
[ >gmt ] 2apply [ >gmt ] 2apply
[ [ >date< julian-day-number ] 2apply - 86400 * ] 2keep [ [ >date< julian-day-number ] 2apply - 86400 * ] 2keep
[ >time< >r >r 3600 * r> 60 * r> + + ] 2apply - + ; [ >time< >r >r 3600 * r> 60 * r> + + ] 2apply - + ;
GENERIC: time- ( time1 time2 -- time )
M: timestamp time-
#! Exact calendar-time difference
(time-) seconds ;
: before ( dt -- -dt )
[ year>> neg ] keep
[ month>> neg ] keep
[ day>> neg ] keep
[ hour>> neg ] keep
[ minute>> neg ] keep
second>> neg
<duration> ;
M: duration time-
before time+ ;
: <zero> 0 0 0 0 0 0 0 <timestamp> ;
: valid-timestamp? ( timestamp -- ? )
clone 0 >>gmt-offset
dup <zero> time- <zero> time+ = ;
: unix-1970 ( -- timestamp ) : unix-1970 ( -- timestamp )
1970 1 1 0 0 0 0 <timestamp> ; 1970 1 1 0 0 0 0 <timestamp> ; foldable
: millis>timestamp ( n -- timestamp ) : millis>timestamp ( n -- timestamp )
>r unix-1970 r> 1000 /f seconds +dt ; >r unix-1970 r> milliseconds time+ ;
: timestamp>millis ( timestamp -- n ) : timestamp>millis ( timestamp -- n )
unix-1970 timestamp- 1000 * >integer ; unix-1970 (time-) 1000 * >integer ;
: unix-time>timestamp ( n -- timestamp )
>r unix-1970 r> seconds +dt ;
: timestamp>unix-time ( timestamp -- n )
unix-1970 timestamp- >integer ;
: timestamp>timeval ( timestamp -- timeval )
timestamp>unix-time 1000 * make-timeval ;
: timeval>timestamp ( timeval -- timestamp )
[ timeval-sec ] keep
timeval-usec 1000000 / + unix-time>timestamp ;
: gmt ( -- timestamp ) : gmt ( -- timestamp )
#! GMT time, right now #! GMT time, right now
unix-1970 millis 1000 /f seconds +dt ; unix-1970 millis milliseconds time+ ;
: now ( -- timestamp ) gmt >local-time ; : now ( -- timestamp ) gmt >local-time ;
: before ( dt -- -dt ) tuple-slots vneg array>dt ;
: from-now ( dt -- timestamp ) now swap +dt ;
: ago ( dt -- timestamp ) before from-now ;
: day-counts { 0 31 28 31 30 31 30 31 31 30 31 30 31 } ; : from-now ( dt -- timestamp ) now swap time+ ;
: ago ( dt -- timestamp ) now swap time- ;
: day-counts { 0 31 28 31 30 31 30 31 31 30 31 30 31 } ; inline
: zeller-congruence ( year month day -- n ) : zeller-congruence ( year month day -- n )
#! Zeller Congruence #! Zeller Congruence
@ -268,7 +301,7 @@ M: timestamp <=> ( ts1 ts2 -- n )
GENERIC: days-in-year ( obj -- n ) GENERIC: days-in-year ( obj -- n )
M: integer days-in-year ( year -- n ) leap-year? 366 365 ? ; M: integer days-in-year ( year -- n ) leap-year? 366 365 ? ;
M: timestamp days-in-year ( timestamp -- n ) timestamp-year days-in-year ; M: timestamp days-in-year ( timestamp -- n ) year>> days-in-year ;
GENERIC: days-in-month ( obj -- n ) GENERIC: days-in-month ( obj -- n )
@ -280,7 +313,7 @@ M: array days-in-month ( obj -- n )
] if ; ] if ;
M: timestamp days-in-month ( timestamp -- n ) M: timestamp days-in-month ( timestamp -- n )
{ timestamp-year timestamp-month } get-slots 2array days-in-month ; >date< drop 2array days-in-month ;
GENERIC: day-of-week ( obj -- n ) GENERIC: day-of-week ( obj -- n )
@ -297,156 +330,20 @@ M: array day-of-year ( array -- n )
3dup day-counts rot head-slice sum + 3dup day-counts rot head-slice sum +
swap leap-year? [ swap leap-year? [
-roll -roll
pick 3 1 make-date >r make-date r> pick 3 1 <date> >r <date> r>
<=> 0 >= [ 1+ ] when after=? [ 1+ ] when
] [ ] [
3nip >r 3drop r>
] if ; ] if ;
M: timestamp day-of-year ( timestamp -- n ) M: timestamp day-of-year ( timestamp -- n )
{ timestamp-year timestamp-month timestamp-day } get-slots >date< 3array day-of-year ;
3array day-of-year ;
GENERIC: day. ( obj -- )
M: integer day. ( n -- )
number>string dup length 2 < [ bl ] when write ;
M: timestamp day. ( timestamp -- )
timestamp-day day. ;
GENERIC: month. ( obj -- )
M: array month. ( pair -- )
first2
[ month-names nth write bl number>string print ] 2keep
[ 1 zeller-congruence ] 2keep
2array days-in-month day-abbreviations2 " " join print
over " " <repetition> concat write
[
[ 1+ day. ] keep
1+ + 7 mod zero? [ nl ] [ bl ] if
] with each nl ;
M: timestamp month. ( timestamp -- )
{ timestamp-year timestamp-month } get-slots 2array month. ;
GENERIC: year. ( obj -- )
M: integer year. ( n -- )
12 [ 1+ 2array month. nl ] with each ;
M: timestamp year. ( timestamp -- )
timestamp-year year. ;
: pad-00 number>string 2 CHAR: 0 pad-left ;
: write-00 pad-00 write ;
: (timestamp>string) ( timestamp -- )
dup day-of-week day-abbreviations3 nth write ", " write
dup timestamp-day number>string write bl
dup timestamp-month month-abbreviations nth write bl
dup timestamp-year number>string write bl
dup timestamp-hour write-00 ":" write
dup timestamp-minute write-00 ":" write
timestamp-second >fixnum write-00 ;
: timestamp>string ( timestamp -- str )
[ (timestamp>string) ] with-string-writer ;
: (write-gmt-offset) ( ratio -- )
1 /mod swap write-00 60 * write-00 ;
: write-gmt-offset ( gmt-offset -- )
{
{ [ dup zero? ] [ drop "GMT" write ] }
{ [ dup 0 < ] [ "-" write neg (write-gmt-offset) ] }
{ [ dup 0 > ] [ "+" write (write-gmt-offset) ] }
} cond ;
: timestamp>rfc822-string ( timestamp -- str )
#! RFC822 timestamp format
#! Example: Tue, 15 Nov 1994 08:12:31 +0200
[
dup (timestamp>string)
" " write
timestamp-gmt-offset write-gmt-offset
] with-string-writer ;
: timestamp>http-string ( timestamp -- str )
#! http timestamp format
#! Example: Tue, 15 Nov 1994 08:12:31 GMT
>gmt timestamp>rfc822-string ;
: write-rfc3339-gmt-offset ( n -- )
dup zero? [ drop "Z" write ] [
dup 0 < [ CHAR: - write1 neg ] [ CHAR: + write1 ] if
60 * 60 /mod swap write-00 CHAR: : write1 write-00
] if ;
: (timestamp>rfc3339) ( timestamp -- )
dup timestamp-year number>string write CHAR: - write1
dup timestamp-month write-00 CHAR: - write1
dup timestamp-day write-00 CHAR: T write1
dup timestamp-hour write-00 CHAR: : write1
dup timestamp-minute write-00 CHAR: : write1
dup timestamp-second >fixnum write-00
timestamp-gmt-offset write-rfc3339-gmt-offset ;
: timestamp>rfc3339 ( timestamp -- str )
[ (timestamp>rfc3339) ] with-string-writer ;
: expect ( str -- )
read1 swap member? [ "Parse error" throw ] unless ;
: read-00 2 read string>number ;
: read-0000 4 read string>number ;
: read-rfc3339-gmt-offset ( -- n )
read1 dup CHAR: Z = [ drop 0 ] [
{ { CHAR: + [ 1 ] } { CHAR: - [ -1 ] } } case
read-00
read1 { { CHAR: : [ read-00 ] } { f [ 0 ] } } case
60 / + *
] if ;
: (rfc3339>timestamp) ( -- timestamp )
read-0000 ! year
"-" expect
read-00 ! month
"-" expect
read-00 ! day
"Tt" expect
read-00 ! hour
":" expect
read-00 ! minute
":" expect
read-00 ! second
read-rfc3339-gmt-offset ! timezone
<timestamp> ;
: rfc3339>timestamp ( str -- timestamp )
[ (rfc3339>timestamp) ] with-string-reader ;
: file-time-string ( timestamp -- string )
[
[ timestamp-month month-abbreviations nth write ] keep bl
[ timestamp-day number>string 2 32 pad-left write ] keep bl
dup now [ timestamp-year ] 2apply = [
[ timestamp-hour write-00 ] keep ":" write
timestamp-minute write-00
] [
timestamp-year number>string 5 32 pad-left write
] if
] with-string-writer ;
: day-offset ( timestamp m -- timestamp n ) : day-offset ( timestamp m -- timestamp n )
over day-of-week - ; inline over day-of-week - ; inline
: day-this-week ( timestamp n -- timestamp ) : day-this-week ( timestamp n -- timestamp )
day-offset days +dt ; day-offset days time+ ;
: sunday ( timestamp -- timestamp ) 0 day-this-week ; : sunday ( timestamp -- timestamp ) 0 day-this-week ;
: monday ( timestamp -- timestamp ) 1 day-this-week ; : monday ( timestamp -- timestamp ) 1 day-this-week ;
@ -457,25 +354,26 @@ M: timestamp year. ( timestamp -- )
: saturday ( timestamp -- timestamp ) 6 day-this-week ; : saturday ( timestamp -- timestamp ) 6 day-this-week ;
: beginning-of-day ( timestamp -- new-timestamp ) : beginning-of-day ( timestamp -- new-timestamp )
clone dup >r 0 0 0 r> clone
{ set-timestamp-hour set-timestamp-minute set-timestamp-second } 0 >>hour
set-slots ; inline 0 >>minute
0 >>second ; inline
: beginning-of-month ( timestamp -- new-timestamp ) : beginning-of-month ( timestamp -- new-timestamp )
beginning-of-day 1 over set-timestamp-day ; beginning-of-day 1 >>day ;
: beginning-of-week ( timestamp -- new-timestamp ) : beginning-of-week ( timestamp -- new-timestamp )
beginning-of-day sunday ; beginning-of-day sunday ;
: beginning-of-year ( timestamp -- new-timestamp ) : beginning-of-year ( timestamp -- new-timestamp )
beginning-of-month 1 over set-timestamp-month ; beginning-of-month 1 >>month ;
: seconds-since-midnight ( timestamp -- x ) : time-since-midnight ( timestamp -- duration )
dup beginning-of-day timestamp- ; dup beginning-of-day time- ;
M: timestamp sleep-until timestamp>millis sleep-until ; M: timestamp sleep-until timestamp>millis sleep-until ;
M: dt sleep from-now sleep-until ; M: duration sleep from-now sleep-until ;
{ {
{ [ unix? ] [ "calendar.unix" ] } { [ unix? ] [ "calendar.unix" ] }

View File

@ -0,0 +1,22 @@
IN: temporary
USING: calendar.format tools.test io.streams.string ;
[ 0 ] [
"Z" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test
[ 1 ] [
"+01" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test
[ -1 ] [
"-01" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test
[ -1-1/2 ] [
"-01:30" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test
[ 1+1/2 ] [
"+01:30" [ read-rfc3339-gmt-offset ] with-string-reader
] unit-test

View File

@ -0,0 +1,138 @@
IN: calendar.format
USING: math math.parser kernel sequences io calendar
accessors arrays io.streams.string combinators accessors ;
GENERIC: day. ( obj -- )
M: integer day. ( n -- )
number>string dup length 2 < [ bl ] when write ;
M: timestamp day. ( timestamp -- )
day>> day. ;
GENERIC: month. ( obj -- )
M: array month. ( pair -- )
first2
[ month-names nth write bl number>string print ] 2keep
[ 1 zeller-congruence ] 2keep
2array days-in-month day-abbreviations2 " " join print
over " " <repetition> concat write
[
[ 1+ day. ] keep
1+ + 7 mod zero? [ nl ] [ bl ] if
] with each nl ;
M: timestamp month. ( timestamp -- )
{ year>> month>> } get-slots 2array month. ;
GENERIC: year. ( obj -- )
M: integer year. ( n -- )
12 [ 1+ 2array month. nl ] with each ;
M: timestamp year. ( timestamp -- )
year>> year. ;
: pad-00 number>string 2 CHAR: 0 pad-left ;
: write-00 pad-00 write ;
: (timestamp>string) ( timestamp -- )
dup day-of-week day-abbreviations3 nth write ", " write
dup day>> number>string write bl
dup month>> month-abbreviations nth write bl
dup year>> number>string write bl
dup hour>> write-00 ":" write
dup minute>> write-00 ":" write
second>> >integer write-00 ;
: timestamp>string ( timestamp -- str )
[ (timestamp>string) ] with-string-writer ;
: (write-gmt-offset) ( ratio -- )
1 /mod swap write-00 60 * write-00 ;
: write-gmt-offset ( gmt-offset -- )
{
{ [ dup zero? ] [ drop "GMT" write ] }
{ [ dup 0 < ] [ "-" write neg (write-gmt-offset) ] }
{ [ dup 0 > ] [ "+" write (write-gmt-offset) ] }
} cond ;
: timestamp>rfc822-string ( timestamp -- str )
#! RFC822 timestamp format
#! Example: Tue, 15 Nov 1994 08:12:31 +0200
[
dup (timestamp>string)
" " write
gmt-offset>> write-gmt-offset
] with-string-writer ;
: timestamp>http-string ( timestamp -- str )
#! http timestamp format
#! Example: Tue, 15 Nov 1994 08:12:31 GMT
>gmt timestamp>rfc822-string ;
: write-rfc3339-gmt-offset ( n -- )
dup zero? [ drop "Z" write ] [
dup 0 < [ CHAR: - write1 neg ] [ CHAR: + write1 ] if
60 * 60 /mod swap write-00 CHAR: : write1 write-00
] if ;
: (timestamp>rfc3339) ( timestamp -- )
dup year>> number>string write CHAR: - write1
dup month>> write-00 CHAR: - write1
dup day>> write-00 CHAR: T write1
dup hour>> write-00 CHAR: : write1
dup minute>> write-00 CHAR: : write1
dup second>> >fixnum write-00
gmt-offset>> write-rfc3339-gmt-offset ;
: timestamp>rfc3339 ( timestamp -- str )
[ (timestamp>rfc3339) ] with-string-writer ;
: expect ( str -- )
read1 swap member? [ "Parse error" throw ] unless ;
: read-00 2 read string>number ;
: read-0000 4 read string>number ;
: read-rfc3339-gmt-offset ( -- n )
read1 dup CHAR: Z = [ drop 0 ] [
{ { CHAR: + [ 1 ] } { CHAR: - [ -1 ] } } case
read-00
read1 { { CHAR: : [ read-00 ] } { f [ 0 ] } } case
60 / + *
] if ;
: (rfc3339>timestamp) ( -- timestamp )
read-0000 ! year
"-" expect
read-00 ! month
"-" expect
read-00 ! day
"Tt" expect
read-00 ! hour
":" expect
read-00 ! minute
":" expect
read-00 ! second
read-rfc3339-gmt-offset ! timezone
<timestamp> ;
: rfc3339>timestamp ( str -- timestamp )
[ (rfc3339>timestamp) ] with-string-reader ;
: file-time-string ( timestamp -- string )
[
[ month>> month-abbreviations nth write ] keep bl
[ day>> number>string 2 32 pad-left write ] keep bl
dup now [ year>> ] 2apply = [
[ hour>> write-00 ] keep ":" write
minute>> write-00
] [
year>> number>string 5 32 pad-left write
] if
] with-string-writer ;

View File

@ -24,7 +24,7 @@ IN: channels.examples
from swap dupd mod zero? not [ swap to ] [ 2drop ] if from swap dupd mod zero? not [ swap to ] [ 2drop ] if
] 3keep filter ; ] 3keep filter ;
:: (sieve) | prime c | ( prime c -- ) :: (sieve) ( prime c -- )
[let | p [ c from ] [let | p [ c from ]
newc [ <channel> ] | newc [ <channel> ] |
p prime to p prime to

View File

@ -2,6 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: strings arrays hashtables assocs sequences USING: strings arrays hashtables assocs sequences
xml.writer xml.utilities kernel namespaces ; xml.writer xml.utilities kernel namespaces ;
IN: cocoa.plists
GENERIC: >plist ( obj -- tag ) GENERIC: >plist ( obj -- tag )

View File

@ -3,7 +3,7 @@ USING: sequences tools.test concurrency.exchangers
concurrency.count-downs concurrency.promises locals kernel concurrency.count-downs concurrency.promises locals kernel
threads ; threads ;
:: exchanger-test | | :: exchanger-test ( -- )
[let | [let |
ex [ <exchanger> ] ex [ <exchanger> ]
c [ 2 <count-down> ] c [ 2 <count-down> ]

View File

@ -3,7 +3,7 @@ USING: tools.test concurrency.locks concurrency.count-downs
concurrency.messaging concurrency.mailboxes locals kernel concurrency.messaging concurrency.mailboxes locals kernel
threads sequences calendar ; threads sequences calendar ;
:: lock-test-0 | | :: lock-test-0 ( -- )
[let | v [ V{ } clone ] [let | v [ V{ } clone ]
c [ 2 <count-down> ] | c [ 2 <count-down> ] |
@ -27,7 +27,7 @@ threads sequences calendar ;
v v
] ; ] ;
:: lock-test-1 | | :: lock-test-1 ( -- )
[let | v [ V{ } clone ] [let | v [ V{ } clone ]
l [ <lock> ] l [ <lock> ]
c [ 2 <count-down> ] | c [ 2 <count-down> ] |
@ -79,7 +79,7 @@ threads sequences calendar ;
[ ] [ <rw-lock> dup [ [ ] with-read-lock ] with-write-lock ] unit-test [ ] [ <rw-lock> dup [ [ ] with-read-lock ] with-write-lock ] unit-test
:: rw-lock-test-1 | | :: rw-lock-test-1 ( -- )
[let | l [ <rw-lock> ] [let | l [ <rw-lock> ]
c [ 1 <count-down> ] c [ 1 <count-down> ]
c' [ 1 <count-down> ] c' [ 1 <count-down> ]
@ -129,7 +129,7 @@ threads sequences calendar ;
[ V{ 1 2 3 4 5 6 } ] [ rw-lock-test-1 ] unit-test [ V{ 1 2 3 4 5 6 } ] [ rw-lock-test-1 ] unit-test
:: rw-lock-test-2 | | :: rw-lock-test-2 ( -- )
[let | l [ <rw-lock> ] [let | l [ <rw-lock> ]
c [ 1 <count-down> ] c [ 1 <count-down> ]
c' [ 2 <count-down> ] c' [ 2 <count-down> ]
@ -160,7 +160,7 @@ threads sequences calendar ;
[ V{ 1 2 3 } ] [ rw-lock-test-2 ] unit-test [ V{ 1 2 3 } ] [ rw-lock-test-2 ] unit-test
! Test lock timeouts ! Test lock timeouts
:: lock-timeout-test | | :: lock-timeout-test ( -- )
[let | l [ <lock> ] | [let | l [ <lock> ] |
[ [
l [ 1 seconds sleep ] with-lock l [ 1 seconds sleep ] with-lock

View File

@ -9,7 +9,7 @@ HELP: <semaphore>
{ $description "Creates a counting semaphore with the specified initial count." } ; { $description "Creates a counting semaphore with the specified initial count." } ;
HELP: acquire-timeout HELP: acquire-timeout
{ $values { "semaphore" semaphore } { "timeout" "a " { $link dt } " or " { $link f } } { "value" object } } { $values { "semaphore" semaphore } { "timeout" "a " { $link duration } " or " { $link f } } { "value" object } }
{ $description "If the semaphore has a non-zero count, decrements it and returns immediately. Otherwise, if the timeout is " { $link f } ", waits indefinitely for the semaphore to be released. If the timeout is not " { $link f } ", waits a certain period of time, and if the semaphore still has not been released, throws an error." } { $description "If the semaphore has a non-zero count, decrements it and returns immediately. Otherwise, if the timeout is " { $link f } ", waits indefinitely for the semaphore to be released. If the timeout is not " { $link f } ", waits a certain period of time, and if the semaphore still has not been released, throws an error." }
{ $errors "Throws an error if the timeout expires before the semaphore is released." } ; { $errors "Throws an error if the timeout expires before the semaphore is released." } ;
@ -22,7 +22,7 @@ HELP: release
{ $description "Increments a semaphore's count. If the count was previously zero, any threads waiting on the semaphore are woken up." } ; { $description "Increments a semaphore's count. If the count was previously zero, any threads waiting on the semaphore are woken up." } ;
HELP: with-semaphore-timeout HELP: with-semaphore-timeout
{ $values { "semaphore" semaphore } { "timeout" "a " { $link dt } " or " { $link f } } { "quot" quotation } } { $values { "semaphore" semaphore } { "timeout" "a " { $link duration } " or " { $link f } } { "quot" quotation } }
{ $description "Calls the quotation with the semaphore held." } ; { $description "Calls the quotation with the semaphore held." } ;
HELP: with-semaphore HELP: with-semaphore

View File

@ -32,7 +32,7 @@ SYMBOL: old-d
old-c c update-old-new old-c c update-old-new
old-d d update-old-new ; old-d d update-old-new ;
:: (ABCD) | x s i k func a b c d | :: (ABCD) ( x s i k func a b c d -- )
#! a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s) #! a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
a [ a [
b get c get d get func call w+ b get c get d get func call w+

View File

@ -2,11 +2,41 @@ USING: farkup kernel tools.test ;
IN: temporary IN: temporary
[ "<ul><li>foo</li></ul>" ] [ "-foo" parse-farkup ] unit-test [ "<ul><li>foo</li></ul>" ] [ "-foo" parse-farkup ] unit-test
[ "<ul><li>foo</li></ul>" ] [ "-foo\n" parse-farkup ] unit-test [ "<ul><li>foo</li></ul>\n" ] [ "-foo\n" parse-farkup ] unit-test
[ "<ul><li>foo</li><li>bar</li></ul>" ] [ "-foo\n-bar" parse-farkup ] unit-test [ "<ul><li>foo</li><li>bar</li></ul>" ] [ "-foo\n-bar" parse-farkup ] unit-test
[ "<ul><li>foo</li><li>bar</li></ul>" ] [ "-foo\n-bar\n" parse-farkup ] unit-test [ "<ul><li>foo</li><li>bar</li></ul>\n" ] [ "-foo\n-bar\n" parse-farkup ] unit-test
[ "<ul><li>foo</li></ul><p>bar</p>" ] [ "-foo\nbar\n" parse-farkup ] unit-test [ "<ul><li>foo</li></ul>\n<p>bar\n</p>" ] [ "-foo\nbar\n" parse-farkup ] unit-test
[ "*foo\nbar\n" parse-farkup ] must-fail [ "<p>*foo\nbar\n</p>" ] [ "*foo\nbar\n" parse-farkup ] unit-test
[ "<p><strong>Wow!</strong></p>" ] [ "*Wow!*" parse-farkup ] unit-test [ "<p><strong>Wow!</strong></p>" ] [ "*Wow!*" parse-farkup ] unit-test
[ "<p><em>Wow.</em></p>" ] [ "_Wow._" parse-farkup ] unit-test [ "<p><em>Wow.</em></p>" ] [ "_Wow._" parse-farkup ] unit-test
[ "<p>*</p>" ] [ "*" parse-farkup ] unit-test
[ "<p>*</p>" ] [ "\\*" parse-farkup ] unit-test
[ "<p>**</p>" ] [ "\\**" parse-farkup ] unit-test
[ "" ] [ "\n\n" parse-farkup ] unit-test
[ "\n" ] [ "\n\n\n" parse-farkup ] unit-test
[ "<p>foo</p><p>bar</p>" ] [ "foo\n\nbar" parse-farkup ] unit-test
[ "\n<p>bar\n</p>" ] [ "\nbar\n" parse-farkup ] unit-test
[ "<p>foo</p>\n<p>bar</p>" ] [ "foo\n\n\nbar" parse-farkup ] unit-test
[ "" ] [ "" parse-farkup ] unit-test
[ "<p>|a</p>" ]
[ "|a" parse-farkup ] unit-test
[ "<p>|a|</p>" ]
[ "|a|" parse-farkup ] unit-test
[ "<table><tr><td>a</td><td>b</td></tr></table>" ]
[ "a|b" parse-farkup ] unit-test
[ "<table><tr><td>a</td><td>b</td></tr></table>\n<table><tr><td>c</td><td>d</td></tr></table>" ]
[ "a|b\nc|d" parse-farkup ] unit-test
[ "<table><tr><td>a</td><td>b</td></tr></table>\n<table><tr><td>c</td><td>d</td></tr></table>\n" ]
[ "a|b\nc|d\n" parse-farkup ] unit-test

View File

@ -3,23 +3,37 @@
USING: arrays io kernel memoize namespaces peg USING: arrays io kernel memoize namespaces peg
peg.ebnf sequences strings html.elements xml.entities peg.ebnf sequences strings html.elements xml.entities
xmode.code2html splitting io.streams.string html xmode.code2html splitting io.streams.string html
html.elements sequences.deep unicode.categories ; html.elements sequences.deep ascii ;
! unicode.categories ;
USE: tools.walker USE: tools.walker
IN: farkup IN: farkup
MEMO: any-char ( -- parser ) [ drop t ] satisfy ; MEMO: any-char ( -- parser ) [ drop t ] satisfy ;
: delimiters ( -- string )
"*_^~%=[-|\\\n" ; inline
MEMO: text ( -- parser ) MEMO: text ( -- parser )
[ "*_^~%=[-|\n" member? not ] satisfy repeat1 [ delimiters member? not ] satisfy repeat1
[ >string escape-string ] action ; [ >string escape-string ] action ;
MEMO: delimiter ( -- parser )
[ dup delimiters member? swap CHAR: \n = not and ] satisfy
[ 1string ] action ;
: surround-with-foo ( string tag -- seq )
dup <foo> swap </foo> swapd 3array ;
: delimited ( str html -- parser ) : delimited ( str html -- parser )
[ [
over token hide , over token hide ,
text [ dup <foo> swap </foo> swapd 3array ] swapd curry action , text [ surround-with-foo ] swapd curry action ,
token hide , token hide ,
] seq* ; ] seq* ;
MEMO: escaped-char ( -- parser )
[ "\\" token hide , any-char , ] seq* [ >string ] action ;
MEMO: strong ( -- parser ) "*" "strong" delimited ; MEMO: strong ( -- parser ) "*" "strong" delimited ;
MEMO: emphasis ( -- parser ) "_" "em" delimited ; MEMO: emphasis ( -- parser ) "_" "em" delimited ;
MEMO: superscript ( -- parser ) "^" "sup" delimited ; MEMO: superscript ( -- parser ) "^" "sup" delimited ;
@ -29,6 +43,7 @@ MEMO: h1 ( -- parser ) "=" "h1" delimited ;
MEMO: h2 ( -- parser ) "==" "h2" delimited ; MEMO: h2 ( -- parser ) "==" "h2" delimited ;
MEMO: h3 ( -- parser ) "===" "h3" delimited ; MEMO: h3 ( -- parser ) "===" "h3" delimited ;
MEMO: h4 ( -- parser ) "====" "h4" delimited ; MEMO: h4 ( -- parser ) "====" "h4" delimited ;
MEMO: nl ( -- parser ) "\n" token ;
MEMO: 2nl ( -- parser ) "\n\n" token hide ; MEMO: 2nl ( -- parser ) "\n\n" token hide ;
: render-code ( string mode -- string' ) : render-code ( string mode -- string' )
@ -60,14 +75,23 @@ MEMO: link ( -- parser ) [ simple-link , labelled-link , ] choice* ;
DEFER: line DEFER: line
MEMO: list-item ( -- parser ) MEMO: list-item ( -- parser )
[ [
"-" token hide , "-" token hide , line ,
line , ] seq* [ "li" surround-with-foo ] action ;
] seq*
[ "li" <foo> swap "li" </foo> 3array ] action ;
MEMO: list ( -- parser ) MEMO: list ( -- parser )
list-item "\n" token hide list-of list-item "\n" token hide list-of
[ "ul" <foo> swap "ul" </foo> 3array ] action ; [ "ul" surround-with-foo ] action ;
MEMO: table-column ( -- parser )
text [ "td" surround-with-foo ] action ;
MEMO: table-row ( -- parser )
[
table-column "|" token hide list-of* ,
] seq* [ "tr" surround-with-foo ] action ;
MEMO: table ( -- parser )
table-row repeat1 [ "table" surround-with-foo ] action ;
MEMO: code ( -- parser ) MEMO: code ( -- parser )
[ [
@ -81,30 +105,44 @@ MEMO: code ( -- parser )
] seq* [ concat ] action , ] seq* [ concat ] action ,
] seq* [ first2 swap render-code ] action ; ] seq* [ first2 swap render-code ] action ;
MEMO: table-column ( -- parser ) [ "|" token text ] seq* ;
MEMO: table-row ( -- parser ) [ ] seq* ;
MEMO: table ( -- parser ) [ "[" ] seq* ;
MEMO: line ( -- parser ) MEMO: line ( -- parser )
[ [
text , strong , emphasis , link , text , strong , emphasis , link ,
superscript , subscript , inline-code , superscript , subscript , inline-code ,
escaped-char , delimiter ,
] choice* repeat1 ; ] choice* repeat1 ;
MEMO: paragraph ( -- parser ) MEMO: paragraph ( -- parser )
line
"\n" token over 2seq repeat0
"\n" token "\n" token ensure-not 2seq optional 3seq
[ [
line [ dup [ dup string? not swap [ blank? ] all? or ] deep-all?
dup [ [ blank? ] all? ] deep-all? [ "<p>" swap "</p>" 3array ] unless
[ "<p>" swap "</p>" 3array ] unless ] action ;
] action ,
"\n" token hide ,
] choice* ;
MEMO: farkup ( -- parser ) MEMO: farkup ( -- parser )
[ [
list , h1 , h2 , h3 , h4 , code , paragraph , 2nl , list , table , h1 , h2 , h3 , h4 , code , paragraph , 2nl , nl ,
] choice* repeat1 ; ] choice* repeat0 "\n" token optional 2seq ;
: farkup. ( parse-result -- )
parse-result-ast
[ dup string? [ write ] [ drop ] if ] deep-each ;
: parse-farkup ( string -- string' ) : parse-farkup ( string -- string' )
farkup parse parse-result-ast farkup parse [ farkup. ] with-string-writer ;
[ [ dup string? [ write ] [ drop ] if ] deep-each ] with-string-writer ;
! MEMO: table-column ( -- parser )
! text [ "td" surround-with-foo ] action ;
!
! MEMO: table-row ( -- parser )
! [
! "|" token hide ,
! table-column "|" token hide list-of ,
! "|" token "\n" token 2array choice hide ,
! ] seq* [ "tr" surround-with-foo ] action ;
!
! MEMO: table ( -- parser )
! table-row repeat1
! [ "table" surround-with-foo ] action ;

View File

@ -78,7 +78,7 @@ $nl
"This is used in situations where you want a spawn child process with some overridden environment variables." } ; "This is used in situations where you want a spawn child process with some overridden environment variables." } ;
HELP: +timeout+ HELP: +timeout+
{ $description "Launch descriptor key. If set to a " { $link dt } ", specifies a maximum running time for the process. If the process runs longer than this time, it will be killed." } ; { $description "Launch descriptor key. If set to a " { $link duration } ", specifies a maximum running time for the process. If the process runs longer than this time, it will be killed." } ;
HELP: default-descriptor HELP: default-descriptor
{ $description "Association storing default values for launch descriptor keys." } ; { $description "Association storing default values for launch descriptor keys." } ;

View File

@ -1,5 +1,5 @@
USING: io.files kernel sequences new-slots accessors USING: io.files kernel sequences new-slots accessors
dlists arrays ; dlists arrays sequences.lib ;
IN: io.paths IN: io.paths
TUPLE: directory-iterator path bfs queue ; TUPLE: directory-iterator path bfs queue ;
@ -34,19 +34,17 @@ TUPLE: directory-iterator path bfs queue ;
drop r> r> r> 3drop f drop r> r> r> 3drop f
] if ; inline ] if ; inline
: prepare-find-file ( path bfs? quot -- iter quot' )
>r <directory-iterator> r> [ keep and ] curry ; inline
: find-file ( path bfs? quot -- path/f ) : find-file ( path bfs? quot -- path/f )
prepare-find-file iterate-directory ; >r <directory-iterator> r>
[ keep and ] curry iterate-directory ; inline
: each-file ( path bfs? quot -- )
>r <directory-iterator> r>
[ f ] compose iterate-directory drop ; inline
: find-all-files ( path bfs? quot -- paths ) : find-all-files ( path bfs? quot -- paths )
prepare-find-file V{ } clone [ >r <directory-iterator> r>
[ over [ push ] [ 2drop ] if f ] curry compose pusher >r iterate-directory drop r> ; inline
iterate-directory
drop
] keep ; inline
: recursive-directory ( path bfs? -- paths ) : recursive-directory ( path bfs? -- paths )
<directory-iterator> [ ] accumulator >r each-file r> ;
[ dup next-file dup ] [ ] [ drop ] unfold nip ;

View File

@ -24,7 +24,7 @@ C: <sniffer-spec> sniffer-spec
: IOC_INOUT IOC_IN IOC_OUT bitor ; inline : IOC_INOUT IOC_IN IOC_OUT bitor ; inline
: IOC_DIRMASK HEX: e0000000 ; inline : IOC_DIRMASK HEX: e0000000 ; inline
:: ioc | inout group num len | :: ioc ( inout group num len -- n )
group first 8 shift num bitor group first 8 shift num bitor
len IOCPARM_MASK bitand 16 shift bitor len IOCPARM_MASK bitand 16 shift bitor
inout bitor ; inout bitor ;

View File

@ -2,11 +2,11 @@ IN: io.timeouts
USING: help.markup help.syntax math kernel calendar ; USING: help.markup help.syntax math kernel calendar ;
HELP: timeout HELP: timeout
{ $values { "obj" object } { "dt/f" "a " { $link dt } " or " { $link f } } } { $values { "obj" object } { "dt/f" "a " { $link duration } " or " { $link f } } }
{ $contract "Outputs an object's timeout." } ; { $contract "Outputs an object's timeout." } ;
HELP: set-timeout HELP: set-timeout
{ $values { "dt/f" "a " { $link dt } " or " { $link f } } { "obj" object } } { $values { "dt/f" "a " { $link duration } " or " { $link f } } { "obj" object } }
{ $contract "Sets an object's timeout." } ; { $contract "Sets an object's timeout." } ;
HELP: timed-out HELP: timed-out

View File

@ -1,4 +1,7 @@
USING: sequences kernel math io ; USING: sequences kernel math io calendar calendar.format
calendar.model arrays models namespaces ui.gadgets
ui.gadgets.labels
ui.gadgets.theme ui ;
IN: lcd IN: lcd
: lcd-digit ( row digit -- str ) : lcd-digit ( row digit -- str )
@ -6,14 +9,26 @@ IN: lcd
" _ _ _ _ _ _ _ _ " " _ _ _ _ _ _ _ _ "
" | | | _| _| |_| |_ |_ | |_| |_| * " " | | | _| _| |_| |_ |_ | |_| |_| * "
" |_| | |_ _| | _| |_| | |_| | * " " |_| | |_ _| | _| |_| | |_| | * "
" "
} nth >r 4 * dup 4 + r> subseq ; } nth >r 4 * dup 4 + r> subseq ;
: lcd-row ( num row -- string ) : lcd-row ( num row -- string )
[ swap lcd-digit ] curry { } map-as concat ; [ swap lcd-digit ] curry { } map-as concat ;
: lcd ( digit-str -- string ) : lcd ( digit-str -- string )
3 [ lcd-row ] with map "\n" join ; 4 [ lcd-row ] with map "\n" join ;
: lcd-demo ( -- ) "31337" lcd print ; : hh:mm:ss ( timestamp -- string )
{
timestamp-hour timestamp-minute timestamp-second
} get-slots >fixnum 3array [ pad-00 ] map ":" join ;
MAIN: lcd-demo : <time-display> ( timestamp -- gadget )
[ hh:mm:ss lcd ] <filter> <label-control>
"99:99:99" lcd over set-label-string
monospace-font over set-label-font ;
: time-window ( -- )
[ time get <time-display> "Time" open-window ] with-ui ;
MAIN: time-window

2
extra/lcd/summary.txt Normal file → Executable file
View File

@ -1 +1 @@
7-segment numeric display demo 7-segment LCD clock demo

View File

@ -16,7 +16,7 @@ HELP: [|
{ $examples { $examples
{ $example { $example
"USE: locals" "USE: locals"
":: adder | n | [| m | m n + ] ;" ":: adder ( n -- quot ) [| m | m n + ] ;"
"3 5 adder call ." "3 5 adder call ."
"8" "8"
} }
@ -29,7 +29,7 @@ HELP: [let
{ $examples { $examples
{ $example { $example
"USING: locals math.functions ;" "USING: locals math.functions ;"
":: frobnicate | n seq |" ":: frobnicate ( n seq -- newseq )"
" [let | n' [ n 6 * ] |" " [let | n' [ n 6 * ] |"
" seq [ n' gcd nip ] map ] ;" " seq [ n' gcd nip ] map ] ;"
"6 { 36 14 } frobnicate ." "6 { 36 14 } frobnicate ."
@ -44,7 +44,7 @@ HELP: [wlet
{ $examples { $examples
{ $example { $example
"USE: locals" "USE: locals"
":: quuxify | n seq |" ":: quuxify ( n seq -- newseq )"
" [wlet | add-n [| m | m n + ] |" " [wlet | add-n [| m | m n + ] |"
" seq [ add-n ] map ] ;" " seq [ add-n ] map ] ;"
"2 { 1 2 3 } quuxify ." "2 { 1 2 3 } quuxify ."
@ -57,13 +57,15 @@ HELP: with-locals
{ $description "Performs closure conversion of a lexically-scoped form. All nested sub-forms are converted. This word must be applied to a " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " used in an ordinary definition, however forms in " { $link POSTPONE: :: } " and " { $link POSTPONE: MACRO:: } " definitions are automatically closure-converted and there is no need to use this word." } ; { $description "Performs closure conversion of a lexically-scoped form. All nested sub-forms are converted. This word must be applied to a " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " used in an ordinary definition, however forms in " { $link POSTPONE: :: } " and " { $link POSTPONE: MACRO:: } " definitions are automatically closure-converted and there is no need to use this word." } ;
HELP: :: HELP: ::
{ $syntax ":: word | bindings... | body... ;" } { $syntax ":: word ( bindings... -- outputs... ) body... ;" }
{ $description "Defines a word with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope. Any " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " forms used in the body of the word definition are automatically closure-converted." } { $description "Defines a word with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope. Any " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " forms used in the body of the word definition are automatically closure-converted." }
{ $notes "The output names do not affect the word's behavior, however the compiler attempts to check the stack effect as with other definitions." }
{ $examples "See " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " and " { $link POSTPONE: [wlet } "." } ; { $examples "See " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " and " { $link POSTPONE: [wlet } "." } ;
HELP: MACRO:: HELP: MACRO::
{ $syntax "MACRO:: word | bindings... | body... ;" } { $syntax "MACRO:: word ( bindings... -- outputs... ) body... ;" }
{ $description "Defines a macro with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope. Any " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " forms used in the body of the word definition are automatically closure-converted." } ; { $description "Defines a macro with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope. Any " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " forms used in the body of the word definition are automatically closure-converted." }
{ $notes "The output names do not affect the word's behavior, however the compiler attempts to check the stack effect as with other definitions." } ;
{ POSTPONE: MACRO: POSTPONE: MACRO:: } related-words { POSTPONE: MACRO: POSTPONE: MACRO:: } related-words
@ -72,7 +74,7 @@ ARTICLE: "locals-mutable" "Mutable locals"
$nl $nl
"Here is a example word which outputs a pair of quotations which increment and decrement an internal counter, and then return the new value. The quotations are closed over the counter and each invocation of the word yields new quotations with their unique internal counter:" "Here is a example word which outputs a pair of quotations which increment and decrement an internal counter, and then return the new value. The quotations are closed over the counter and each invocation of the word yields new quotations with their unique internal counter:"
{ $code { $code
":: counter | |" ":: counter ( -- )"
" [let | value! [ 0 ] |" " [let | value! [ 0 ] |"
" [ value 1+ dup value! ]" " [ value 1+ dup value! ]"
" [ value 1- dup value! ] ] ;" " [ value 1- dup value! ] ] ;"
@ -86,7 +88,7 @@ ARTICLE: "locals-limitations" "Limitations of locals"
$nl $nl
"Another limitation is that closure conversion does not descend into arrays, hashtables or other types of literals. For example, the following does not work:" "Another limitation is that closure conversion does not descend into arrays, hashtables or other types of literals. For example, the following does not work:"
{ $code { $code
":: bad-cond-usage | a |" ":: bad-cond-usage ( a -- ... )"
" { [ a 0 < ] [ ... ] }" " { [ a 0 < ] [ ... ] }"
" { [ a 0 > ] [ ... ] }" " { [ a 0 > ] [ ... ] }"
" { [ a 0 = ] [ ... ] } ;" " { [ a 0 = ] [ ... ] } ;"

View File

@ -1,52 +1,52 @@
USING: locals math sequences tools.test hashtables words kernel USING: locals math sequences tools.test hashtables words kernel
namespaces arrays ; namespaces arrays strings prettyprint ;
IN: temporary IN: temporary
:: foo | a b | a a ; :: foo ( a b -- a a ) a a ;
[ 1 1 ] [ 1 2 foo ] unit-test [ 1 1 ] [ 1 2 foo ] unit-test
:: add-test | a b | a b + ; :: add-test ( a b -- c ) a b + ;
[ 3 ] [ 1 2 add-test ] unit-test [ 3 ] [ 1 2 add-test ] unit-test
:: sub-test | a b | a b - ; :: sub-test ( a b -- c ) a b - ;
[ -1 ] [ 1 2 sub-test ] unit-test [ -1 ] [ 1 2 sub-test ] unit-test
:: map-test | a b | a [ b + ] map ; :: map-test ( a b -- seq ) a [ b + ] map ;
[ { 5 6 7 } ] [ { 1 2 3 } 4 map-test ] unit-test [ { 5 6 7 } ] [ { 1 2 3 } 4 map-test ] unit-test
:: map-test-2 | seq inc | seq [| elt | elt inc + ] map ; :: map-test-2 ( seq inc -- seq ) seq [| elt | elt inc + ] map ;
[ { 5 6 7 } ] [ { 1 2 3 } 4 map-test-2 ] unit-test [ { 5 6 7 } ] [ { 1 2 3 } 4 map-test-2 ] unit-test
:: let-test | c | :: let-test ( c -- d )
[let | a [ 1 ] b [ 2 ] | a b + c + ] ; [let | a [ 1 ] b [ 2 ] | a b + c + ] ;
[ 7 ] [ 4 let-test ] unit-test [ 7 ] [ 4 let-test ] unit-test
:: let-test-2 | | :: let-test-2 ( a -- a )
[let | a [ ] | [let | b [ a ] | a ] ] ; a [let | a [ ] | [let | b [ a ] | a ] ] ;
[ 3 ] [ 3 let-test-2 ] unit-test [ 3 ] [ 3 let-test-2 ] unit-test
:: let-test-3 | | :: let-test-3 ( a -- a )
[let | a [ ] | [let | b [ [ a ] ] | [let | a [ 3 ] | b ] ] ] ; a [let | a [ ] | [let | b [ [ a ] ] | [let | a [ 3 ] | b ] ] ] ;
:: let-test-4 | | :: let-test-4 ( a -- b )
[let | a [ 1 ] b [ ] | a b 2array ] ; a [let | a [ 1 ] b [ ] | a b 2array ] ;
[ { 1 2 } ] [ 2 let-test-4 ] unit-test [ { 1 2 } ] [ 2 let-test-4 ] unit-test
:: let-test-5 | | :: let-test-5 ( a -- b )
[let | a [ ] b [ ] | a b 2array ] ; a [let | a [ ] b [ ] | a b 2array ] ;
[ { 2 1 } ] [ 1 2 let-test-5 ] unit-test [ { 2 1 } ] [ 1 2 let-test-5 ] unit-test
:: let-test-6 | | :: let-test-6 ( a -- b )
[let | a [ ] b [ 1 ] | a b 2array ] ; a [let | a [ ] b [ 1 ] | a b 2array ] ;
[ { 2 1 } ] [ 2 let-test-6 ] unit-test [ { 2 1 } ] [ 2 let-test-6 ] unit-test
@ -57,26 +57,26 @@ IN: temporary
with-locals with-locals
] unit-test ] unit-test
:: wlet-test-2 | a b | :: wlet-test-2 ( a b -- seq )
[wlet | add-b [ b + ] | [wlet | add-b [ b + ] |
a [ add-b ] map ] ; a [ add-b ] map ] ;
[ { 4 5 6 } ] [ { 2 3 4 } 2 wlet-test-2 ] unit-test [ { 4 5 6 } ] [ { 2 3 4 } 2 wlet-test-2 ] unit-test
:: wlet-test-3 | a | :: wlet-test-3 ( a -- b )
[wlet | add-a [ a + ] | [ add-a ] ] [wlet | add-a [ a + ] | [ add-a ] ]
[let | a [ 3 ] | a swap call ] ; [let | a [ 3 ] | a swap call ] ;
[ 5 ] [ 2 wlet-test-3 ] unit-test [ 5 ] [ 2 wlet-test-3 ] unit-test
:: wlet-test-4 | a | :: wlet-test-4 ( a -- b )
[wlet | sub-a [| b | b a - ] | [wlet | sub-a [| b | b a - ] |
3 sub-a ] ; 3 sub-a ] ;
[ -7 ] [ 10 wlet-test-4 ] unit-test [ -7 ] [ 10 wlet-test-4 ] unit-test
:: write-test-1 | n! | :: write-test-1 ( n! -- q )
[| i | n i + dup n! ] ; [| i | n i + dup n! ] ;
0 write-test-1 "q" set 0 write-test-1 "q" set
@ -89,7 +89,7 @@ IN: temporary
[ 5 ] [ 2 "q" get call ] unit-test [ 5 ] [ 2 "q" get call ] unit-test
:: write-test-2 | | :: write-test-2 ( -- q )
[let | n! [ 0 ] | [let | n! [ 0 ] |
[| i | n i + dup n! ] ] ; [| i | n i + dup n! ] ] ;
@ -108,21 +108,55 @@ write-test-2 "q" set
20 10 [| a! | [| b! | a b ] ] with-locals call call 20 10 [| a! | [| b! | a b ] ] with-locals call call
] unit-test ] unit-test
:: write-test-3 | a! | [| b | b a! ] ; :: write-test-3 ( a! -- q ) [| b | b a! ] ;
[ ] [ 1 2 write-test-3 call ] unit-test [ ] [ 1 2 write-test-3 call ] unit-test
:: write-test-4 | x! | [ [let | y! [ 0 ] | f x! ] ] ; :: write-test-4 ( x! -- q ) [ [let | y! [ 0 ] | f x! ] ] ;
[ ] [ 5 write-test-4 drop ] unit-test [ ] [ 5 write-test-4 drop ] unit-test
SYMBOL: a SYMBOL: a
:: use-test | a b c | :: use-test ( a b c -- a b c )
USE: kernel ; USE: kernel ;
[ t ] [ a symbol? ] unit-test [ t ] [ a symbol? ] unit-test
:: let-let-test | n | [let | n [ n 3 + ] | n ] ; :: let-let-test ( n -- n ) [let | n [ n 3 + ] | n ] ;
[ 13 ] [ 10 let-let-test ] unit-test [ 13 ] [ 10 let-let-test ] unit-test
GENERIC: lambda-generic ( a b -- c )
GENERIC# lambda-generic-1 1 ( a b -- c )
M:: integer lambda-generic-1 ( a b -- c ) a b * ;
M:: string lambda-generic-1 ( a b -- c )
a b CHAR: x <string> lambda-generic ;
M:: integer lambda-generic ( a b -- c ) a b lambda-generic-1 ;
GENERIC# lambda-generic-2 1 ( a b -- c )
M:: integer lambda-generic-2 ( a b -- c )
a CHAR: x <string> b lambda-generic ;
M:: string lambda-generic-2 ( a b -- c ) a b append ;
M:: string lambda-generic ( a b -- c ) a b lambda-generic-2 ;
[ 10 ] [ 5 2 lambda-generic ] unit-test
[ "abab" ] [ "aba" "b" lambda-generic ] unit-test
[ "abaxxx" ] [ "aba" 3 lambda-generic ] unit-test
[ "xaba" ] [ 1 "aba" lambda-generic ] unit-test
[ ] [ \ lambda-generic-1 see ] unit-test
[ ] [ \ lambda-generic-2 see ] unit-test
[ ] [ \ lambda-generic see ] unit-test

View File

@ -4,7 +4,8 @@ USING: kernel namespaces sequences sequences.private assocs math
inference.transforms parser words quotations debugger macros inference.transforms parser words quotations debugger macros
arrays macros splitting combinators prettyprint.backend arrays macros splitting combinators prettyprint.backend
definitions prettyprint hashtables combinators.lib definitions prettyprint hashtables combinators.lib
prettyprint.sections sequences.private ; prettyprint.sections sequences.private effects generic
compiler.units ;
IN: locals IN: locals
! Inspired by ! Inspired by
@ -208,9 +209,6 @@ M: object local-rewrite* , ;
: push-locals ( assoc -- ) : push-locals ( assoc -- )
use get push ; use get push ;
: parse-locals ( -- words assoc )
"|" parse-tokens make-locals ;
: pop-locals ( assoc -- ) : pop-locals ( assoc -- )
use get delete ; use get delete ;
@ -218,7 +216,7 @@ M: object local-rewrite* , ;
over push-locals parse-until >quotation swap pop-locals ; over push-locals parse-until >quotation swap pop-locals ;
: parse-lambda ( -- lambda ) : parse-lambda ( -- lambda )
parse-locals \ ] (parse-lambda) <lambda> ; "|" parse-tokens make-locals \ ] (parse-lambda) <lambda> ;
: (parse-bindings) ( -- ) : (parse-bindings) ( -- )
scan dup "|" = [ scan dup "|" = [
@ -246,11 +244,18 @@ M: wlet local-rewrite*
dup wlet-bindings values over wlet-vars rot wlet-body dup wlet-bindings values over wlet-vars rot wlet-body
<lambda> [ call ] curry compose local-rewrite* \ call , ; <lambda> [ call ] curry compose local-rewrite* \ call , ;
: (::) ( prop -- word quot n ) : parse-locals
>r CREATE dup reset-generic parse-effect
scan "|" assert= parse-locals \ ; (parse-lambda) <lambda> word [ over "declared-effect" set-word-prop ] when*
2dup r> set-word-prop effect-in make-locals ;
[ lambda-rewrite first ] keep lambda-vars length ;
: ((::)) ( word -- word quot )
scan "(" assert= parse-locals \ ; (parse-lambda) <lambda>
2dup "lambda" set-word-prop
lambda-rewrite first ;
: (::) ( -- word quot )
CREATE dup reset-generic ((::)) ;
PRIVATE> PRIVATE>
@ -268,9 +273,22 @@ PRIVATE>
MACRO: with-locals ( form -- quot ) lambda-rewrite ; MACRO: with-locals ( form -- quot ) lambda-rewrite ;
: :: "lambda" (::) drop define ; parsing : :: (::) define ; parsing
: MACRO:: "lambda-macro" (::) (MACRO:) ; parsing ! This will be cleaned up when method tuples and method words
! are unified
: create-method ( class generic -- method )
2dup method dup
[ 2nip method-word ]
[ drop 2dup [ ] -rot define-method create-method ] if ;
: CREATE-METHOD ( -- class generic body )
scan-word bootstrap-word scan-word 2dup
create-method f set-word dup save-location ;
: M:: CREATE-METHOD ((::)) nip -rot define-method ; parsing
: MACRO:: (::) define-macro ; parsing
<PRIVATE <PRIVATE
@ -323,26 +341,42 @@ M: lambda-word definer drop \ :: \ ; ;
M: lambda-word definition M: lambda-word definition
"lambda" word-prop lambda-body ; "lambda" word-prop lambda-body ;
: lambda-word-synopsis ( word prop -- ) : lambda-word-synopsis ( word -- )
over definer. dup definer.
over seeing-word dup seeing-word
over pprint-word dup pprint-word
\ | pprint-word stack-effect. ;
word-prop lambda-vars pprint-vars
\ | pprint-word ;
M: lambda-word synopsis* M: lambda-word synopsis* lambda-word-synopsis ;
"lambda" lambda-word-synopsis ;
PREDICATE: macro lambda-macro PREDICATE: macro lambda-macro
"lambda-macro" word-prop >boolean ; "lambda" word-prop >boolean ;
M: lambda-macro definer drop \ MACRO:: \ ; ; M: lambda-macro definer drop \ MACRO:: \ ; ;
M: lambda-macro definition M: lambda-macro definition
"lambda-macro" word-prop lambda-body ; "lambda" word-prop lambda-body ;
M: lambda-macro synopsis* M: lambda-macro synopsis* lambda-word-synopsis ;
"lambda-macro" lambda-word-synopsis ;
PREDICATE: method-body lambda-method
"lambda" word-prop >boolean ;
M: lambda-method definer drop \ M:: \ ; ;
M: lambda-method definition
"lambda" word-prop lambda-body ;
: method-stack-effect
dup "lambda" word-prop lambda-vars
swap "method" word-prop method-generic stack-effect dup [ effect-out ] when
<effect> ;
M: lambda-method synopsis*
dup definer.
dup "method" word-prop dup
method-specializer pprint*
method-generic pprint*
method-stack-effect effect>string comment. ;
PRIVATE> PRIVATE>

View File

@ -3,7 +3,7 @@
USING: parser-combinators memoize kernel sequences USING: parser-combinators memoize kernel sequences
logging arrays words strings vectors io io.files logging arrays words strings vectors io io.files
namespaces combinators combinators.lib logging.server namespaces combinators combinators.lib logging.server
calendar ; calendar calendar.format ;
IN: logging.parser IN: logging.parser
: string-of satisfy <!*> [ >string ] <@ ; : string-of satisfy <!*> [ >string ] <@ ;

View File

@ -3,7 +3,7 @@
USING: namespaces kernel io calendar sequences io.files USING: namespaces kernel io calendar sequences io.files
io.sockets continuations prettyprint assocs math.parser io.sockets continuations prettyprint assocs math.parser
words debugger math combinators concurrency.messaging words debugger math combinators concurrency.messaging
threads arrays init math.ranges strings ; threads arrays init math.ranges strings calendar.format ;
IN: logging.server IN: logging.server
: log-root ( -- string ) : log-root ( -- string )

View File

@ -1,26 +1,21 @@
! Copyright (C) 2007 Slava Pestov. ! Copyright (C) 2007, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: parser kernel sequences words effects
USING: parser kernel sequences words effects inference.transforms inference.transforms combinators assocs definitions quotations
combinators assocs definitions quotations namespaces memoize ; namespaces memoize ;
IN: macros IN: macros
: (:) ( -- word definition effect-in )
CREATE dup reset-generic parse-definition
over "declared-effect" word-prop effect-in length ;
: real-macro-effect ( word -- effect' ) : real-macro-effect ( word -- effect' )
"declared-effect" word-prop effect-in 1 <effect> ; "declared-effect" word-prop effect-in 1 <effect> ;
: (MACRO:) ( word definition effect-in -- ) : define-macro ( word definition -- )
>r 2dup "macro" set-word-prop over "declared-effect" word-prop effect-in length >r
2dup over real-macro-effect memoize-quot 2dup "macro" set-word-prop
[ call ] append define 2dup over real-macro-effect memoize-quot [ call ] append define
r> define-transform ; r> define-transform ;
: MACRO: : MACRO:
(:) (MACRO:) ; parsing (:) define-macro ; parsing
PREDICATE: word macro "macro" word-prop >boolean ; PREDICATE: word macro "macro" word-prop >boolean ;

View File

@ -30,7 +30,7 @@ TUPLE: positive-even-expected n ;
#! factor an integer into s * 2^r #! factor an integer into s * 2^r
0 swap (factor-2s) ; 0 swap (factor-2s) ;
:: (miller-rabin) | n prime?! | :: (miller-rabin) ( n prime?! -- ? )
n 1- factor-2s s set r set n 1- factor-2s s set r set
trials get [ trials get [
n 1- [1,b] random a set n 1- [1,b] random a set

View File

@ -153,7 +153,7 @@ HELP: delay
} ; } ;
HELP: <delay> HELP: <delay>
{ $values { "model" model } { "timeout" dt } { "delay" delay } } { $values { "model" model } { "timeout" duration } { "delay" delay } }
{ $description "Creates a new instance of " { $link delay } ". The timeout must elapse from the time the underlying model last changed to when the delay model value is changed and its connections are notified." } { $description "Creates a new instance of " { $link delay } ". The timeout must elapse from the time the underlying model last changed to when the delay model value is changed and its connections are notified." }
{ $examples "See the example in the documentation for " { $link delay } "." } ; { $examples "See the example in the documentation for " { $link delay } "." } ;

View File

@ -34,7 +34,7 @@ IN: new-slots
[ \ over , swap writer-word , ] [ ] make define-inline [ \ over , swap writer-word , ] [ ] make define-inline
] [ 2drop ] if ; ] [ 2drop ] if ;
: changer-effect T{ effect f { "object" "quot" } } ; inline : changer-effect T{ effect f { "object" "quot" } { "object" } } ; inline
: changer-word ( name -- word ) : changer-word ( name -- word )
"change-" swap append changer-effect create-accessor ; "change-" swap append changer-effect create-accessor ;
@ -44,9 +44,9 @@ IN: new-slots
[ [
[ over >r >r ] % [ over >r >r ] %
over reader-word , over reader-word ,
[ r> call r> ] % [ r> call r> swap ] %
swap writer-word , swap setter-word ,
] [ ] make define ] [ ] make define-inline
] [ 2drop ] if ; ] [ 2drop ] if ;
: define-new-slot ( class slot name -- ) : define-new-slot ( class slot name -- )

8
extra/opengl/capabilities/capabilities.factor Normal file → Executable file
View File

@ -26,8 +26,8 @@ IN: opengl.capabilities
: version-seq ( version-string -- version-seq ) : version-seq ( version-string -- version-seq )
"." split [ string>number ] map ; "." split [ string>number ] map ;
: version<=> ( version1 version2 -- n ) : version-before? ( version1 version2 -- ? )
swap version-seq swap version-seq <=> ; swap version-seq swap version-seq before=? ;
: (gl-version) ( -- version vendor ) : (gl-version) ( -- version vendor )
GL_VERSION glGetString " " split1 ; GL_VERSION glGetString " " split1 ;
@ -36,7 +36,7 @@ IN: opengl.capabilities
: gl-vendor-version ( -- version ) : gl-vendor-version ( -- version )
(gl-version) nip ; (gl-version) nip ;
: has-gl-version? ( version -- ? ) : has-gl-version? ( version -- ? )
gl-version version<=> 0 <= ; gl-version version-before? ;
: (make-gl-version-error) ( required-version -- ) : (make-gl-version-error) ( required-version -- )
"Required OpenGL version " % % " not supported (" % gl-version % " available)" % ; "Required OpenGL version " % % " not supported (" % gl-version % " available)" % ;
: require-gl-version ( version -- ) : require-gl-version ( version -- )
@ -51,7 +51,7 @@ IN: opengl.capabilities
: glsl-vendor-version ( -- version ) : glsl-vendor-version ( -- version )
(glsl-version) nip ; (glsl-version) nip ;
: has-glsl-version? ( version -- ? ) : has-glsl-version? ( version -- ? )
glsl-version version<=> 0 <= ; glsl-version version-before? ;
: require-glsl-version ( version -- ) : require-glsl-version ( version -- )
[ has-glsl-version? ] [ has-glsl-version? ]
[ "Required GLSL version " % % " not supported (" % glsl-version % " available)" % ] [ "Required GLSL version " % % " not supported (" % glsl-version % " available)" % ]

View File

@ -306,12 +306,24 @@ MEMO: range ( min max -- parser )
: seq ( seq -- parser ) : seq ( seq -- parser )
seq-parser construct-boa init-parser ; seq-parser construct-boa init-parser ;
: 2seq ( parser1 parser2 -- parser )
2array seq ;
: 3seq ( parser1 parser2 parser3 -- parser )
3array seq ;
: seq* ( quot -- paser ) : seq* ( quot -- paser )
{ } make seq ; inline { } make seq ; inline
: choice ( seq -- parser ) : choice ( seq -- parser )
choice-parser construct-boa init-parser ; choice-parser construct-boa init-parser ;
: 2choice ( parser1 parser2 -- parser )
2array choice ;
: 3choice ( parser1 parser2 parser3 -- parser )
3array choice ;
: choice* ( quot -- paser ) : choice* ( quot -- paser )
{ } make choice ; inline { } make choice ; inline
@ -342,8 +354,15 @@ MEMO: hide ( parser -- parser )
MEMO: delay ( parser -- parser ) MEMO: delay ( parser -- parser )
delay-parser construct-boa init-parser ; delay-parser construct-boa init-parser ;
MEMO: (list-of) ( items separator repeat1? -- parser )
>r over 2seq r> [ repeat1 ] [ repeat0 ] if [ concat ] action 2seq
[ unclip 1vector swap first append ] action ;
MEMO: list-of ( items separator -- parser ) MEMO: list-of ( items separator -- parser )
hide over 2array seq repeat0 [ concat ] action 2array seq [ unclip 1vector swap first append ] action ; hide f (list-of) ;
MEMO: list-of* ( items separator -- parser )
hide t (list-of) ;
MEMO: 'digit' ( -- parser ) MEMO: 'digit' ( -- parser )
[ digit? ] satisfy [ digit> ] action ; [ digit? ] satisfy [ digit> ] action ;

View File

@ -45,25 +45,20 @@ IN: project-euler.019
<PRIVATE <PRIVATE
: start-date ( -- timestamp ) : start-date ( -- timestamp )
1901 1 1 0 0 0 0 make-timestamp ; 1901 1 1 <date> ;
: end-date ( -- timestamp ) : end-date ( -- timestamp )
2000 12 31 0 0 0 0 make-timestamp ; 2000 12 31 <date> ;
: (first-days) ( end-date start-date -- ) : first-days ( end-date start-date -- days )
2dup timestamp- 0 >= [ [ 2dup after=? ]
dup day-of-week , 1 +month (first-days) [ dup 1 months time+ swap day-of-week ]
] [ [ ] unfold 2nip ;
2drop
] if ;
: first-days ( start-date end-date -- seq )
[ swap (first-days) ] { } make ;
PRIVATE> PRIVATE>
: euler019a ( -- answer ) : euler019a ( -- answer )
start-date end-date first-days [ zero? ] count ; end-date start-date first-days [ zero? ] count ;
! [ euler019a ] 100 ave-time ! [ euler019a ] 100 ave-time
! 131 ms run / 3 ms GC ave time - 100 trials ! 131 ms run / 3 ms GC ave time - 100 trials

View File

@ -3,7 +3,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: namespaces io io.timeouts kernel logging io.sockets USING: namespaces io io.timeouts kernel logging io.sockets
sequences combinators sequences.lib splitting assocs strings sequences combinators sequences.lib splitting assocs strings
math.parser random system calendar ; math.parser random system calendar calendar.format ;
IN: smtp IN: smtp

View File

@ -48,9 +48,6 @@ SYMBOL: this-test
: must-fail ( quot -- ) : must-fail ( quot -- )
[ drop t ] must-fail-with ; [ drop t ] must-fail-with ;
: ignore-errors ( quot -- )
[ drop ] recover ; inline
: (run-test) ( vocab -- ) : (run-test) ( vocab -- )
dup vocab-source-loaded? [ dup vocab-source-loaded? [
vocab-tests vocab-tests

View File

@ -5,7 +5,7 @@ sequences concurrency.messaging locals continuations
threads namespaces namespaces.private ; threads namespaces namespaces.private ;
IN: tools.walker.debug IN: tools.walker.debug
:: test-walker | quot | :: test-walker ( quot -- data )
[let | p [ <promise> ] [let | p [ <promise> ]
s [ f <model> ] s [ f <model> ]
c [ f <model> ] | c [ f <model> ] |

4
extra/trees/avl/avl.factor Normal file → Executable file
View File

@ -53,14 +53,14 @@ TUPLE: avl-node balance ;
DEFER: avl-set DEFER: avl-set
: avl-insert ( value key node -- node taller? ) : avl-insert ( value key node -- node taller? )
2dup node-key key< left right ? [ 2dup node-key before? left right ? [
[ node-link avl-set ] keep swap [ node-link avl-set ] keep swap
>r tuck set-node-link r> >r tuck set-node-link r>
[ dup current-side get change-balance balance-insert ] [ f ] if [ dup current-side get change-balance balance-insert ] [ f ] if
] with-side ; ] with-side ;
: (avl-set) ( value key node -- node taller? ) : (avl-set) ( value key node -- node taller? )
2dup node-key key= [ 2dup node-key = [
-rot pick set-node-key over set-node-value f -rot pick set-node-key over set-node-value f
] [ avl-insert ] if ; ] [ avl-insert ] if ;

10
extra/trees/trees.factor Normal file → Executable file
View File

@ -61,10 +61,6 @@ SYMBOL: current-side
#! side is -1 if k1 < k2, 0 if they are equal, or 1 if k1 > k2 #! side is -1 if k1 < k2, 0 if they are equal, or 1 if k1 > k2
<=> sgn ; <=> sgn ;
: key< ( k1 k2 -- ? ) <=> 0 < ;
: key> ( k1 k2 -- ? ) <=> 0 > ;
: key= ( k1 k2 -- ? ) <=> zero? ;
: random-side ( -- side ) left right 2array random ; : random-side ( -- side ) left right 2array random ;
: choose-branch ( key node -- key node-left/right ) : choose-branch ( key node -- key node-left/right )
@ -72,7 +68,7 @@ SYMBOL: current-side
: node-at* ( key node -- value ? ) : node-at* ( key node -- value ? )
[ [
2dup node-key key= [ 2dup node-key = [
nip node-value t nip node-value t
] [ ] [
choose-branch node-at* choose-branch node-at*
@ -97,8 +93,8 @@ M: tree set-at ( value key tree -- )
: valid-node? ( node -- ? ) : valid-node? ( node -- ? )
[ [
dup dup node-left [ node-key swap node-key key< ] when* >r dup dup node-left [ node-key swap node-key before? ] when* >r
dup dup node-right [ node-key swap node-key key> ] when* r> and swap dup dup node-right [ node-key swap node-key after? ] when* r> and swap
dup node-left valid-node? swap node-right valid-node? and and dup node-left valid-node? swap node-right valid-node? and and
] [ t ] if* ; ] [ t ] if* ;

View File

@ -256,7 +256,7 @@ M: editor gadget-text* editor-string % ;
} at T{ one-line-elt } or ; } at T{ one-line-elt } or ;
: drag-direction? ( loc editor -- ? ) : drag-direction? ( loc editor -- ? )
editor-mark* <=> 0 < ; editor-mark* before? ;
: drag-selection-caret ( loc editor element -- loc ) : drag-selection-caret ( loc editor element -- loc )
>r [ drag-direction? ] 2keep >r [ drag-direction? ] 2keep

View File

@ -85,7 +85,7 @@ SYMBOL: mouse-captured
: handle-wm-paint ( hWnd uMsg wParam lParam -- ) : handle-wm-paint ( hWnd uMsg wParam lParam -- )
#! wParam and lParam are unused #! wParam and lParam are unused
#! only paint if width/height both > 0 #! only paint if width/height both > 0
3drop window relayout-1 ; 3drop window relayout-1 yield ;
: handle-wm-size ( hWnd uMsg wParam lParam -- ) : handle-wm-size ( hWnd uMsg wParam lParam -- )
2nip 2nip

View File

@ -17,6 +17,6 @@ SYMBOL: vocab-monitor
[ [
"" resource-path t <monitor> vocab-monitor set-global "" resource-path t <monitor> vocab-monitor set-global
[ monitor-thread t ] "Vocabulary monitor" spawn-server drop [ monitor-thread t ] "Vocabulary monitor" spawn-server drop
] [ drop ] recover ; ] ignore-errors ;
[ start-monitor-thread ] "vocabs.monitor" add-init-hook [ start-monitor-thread ] "vocabs.monitor" add-init-hook

View File

@ -14,7 +14,7 @@ SYMBOL: cgi-root
[ [
"CGI/1.0" "GATEWAY_INTERFACE" set "CGI/1.0" "GATEWAY_INTERFACE" set
"HTTP/1.0" "SERVER_PROTOCOL" set "HTTP/1.0" "SERVER_PROTOCOL" set
"Factor " version append "SERVER_SOFTWARE" set "Factor" "SERVER_SOFTWARE" set
dup "PATH_TRANSLATED" set dup "PATH_TRANSLATED" set
"SCRIPT_FILENAME" set "SCRIPT_FILENAME" set

View File

@ -3,7 +3,7 @@
USING: calendar html io io.files kernel math math.parser USING: calendar html io io.files kernel math math.parser
http.server.responders http.server.templating namespaces parser http.server.responders http.server.templating namespaces parser
sequences strings assocs hashtables debugger http.mime sorting sequences strings assocs hashtables debugger http.mime sorting
html.elements logging ; html.elements logging calendar.format ;
IN: webapps.file IN: webapps.file
SYMBOL: doc-root SYMBOL: doc-root
@ -11,6 +11,9 @@ SYMBOL: doc-root
: serving-path ( filename -- filename ) : serving-path ( filename -- filename )
"" or doc-root get swap path+ ; "" or doc-root get swap path+ ;
: unix-time>timestamp ( n -- timestamp )
>r unix-1970 r> seconds time+ ;
: file-http-date ( filename -- string ) : file-http-date ( filename -- string )
file-modified unix-time>timestamp timestamp>http-string ; file-modified unix-time>timestamp timestamp>http-string ;

View File

@ -1,6 +1,6 @@
USING: calendar furnace furnace.validator io.files kernel USING: calendar furnace furnace.validator io.files kernel
namespaces sequences http.server.responders html math.parser rss namespaces sequences http.server.responders html math.parser rss
xml.writer xmode.code2html math ; xml.writer xmode.code2html math calendar.format ;
IN: webapps.pastebin IN: webapps.pastebin
TUPLE: pastebin pastes ; TUPLE: pastebin pastes ;

View File

@ -2,7 +2,7 @@ USING: sequences rss arrays concurrency.combinators kernel
sorting html.elements io assocs namespaces math threads vocabs sorting html.elements io assocs namespaces math threads vocabs
html furnace http.server.templating calendar math.parser html furnace http.server.templating calendar math.parser
splitting continuations debugger system http.server.responders splitting continuations debugger system http.server.responders
xml.writer prettyprint logging ; xml.writer prettyprint logging calendar.format ;
IN: webapps.planet IN: webapps.planet
: print-posting-summary ( posting -- ) : print-posting-summary ( posting -- )

2
extra/windows/time/time-tests.factor Normal file → Executable file
View File

@ -2,5 +2,5 @@ USING: calendar calendar.windows kernel tools.test ;
[ t ] [ windows-1601 [ timestamp>FILETIME FILETIME>timestamp ] keep = ] unit-test [ t ] [ windows-1601 [ timestamp>FILETIME FILETIME>timestamp ] keep = ] unit-test
[ t ] [ windows-time [ windows-time>FILETIME FILETIME>windows-time ] keep = ] unit-test [ t ] [ windows-time [ windows-time>FILETIME FILETIME>windows-time ] keep = ] unit-test
[ t ] [ windows-1601 400 years +dt [ timestamp>FILETIME FILETIME>timestamp ] keep = ] unit-test [ t ] [ windows-1601 400 years time+ [ timestamp>FILETIME FILETIME>timestamp ] keep = ] unit-test

View File

@ -15,7 +15,7 @@ IN: windows.time
FILETIME-dwHighDateTime >64bit ; FILETIME-dwHighDateTime >64bit ;
: windows-time>timestamp ( n -- timestamp ) : windows-time>timestamp ( n -- timestamp )
10000000 /i seconds windows-1601 swap +dt ; 10000000 /i seconds windows-1601 swap time+ ;
: windows-time ( -- n ) : windows-time ( -- n )
"FILETIME" <c-object> [ GetSystemTimeAsFileTime ] keep "FILETIME" <c-object> [ GetSystemTimeAsFileTime ] keep
@ -23,7 +23,7 @@ IN: windows.time
: timestamp>windows-time ( timestamp -- n ) : timestamp>windows-time ( timestamp -- n )
#! 64bit number representing # of nanoseconds since Jan 1, 1601 (UTC) #! 64bit number representing # of nanoseconds since Jan 1, 1601 (UTC)
>gmt windows-1601 timestamp- >bignum 10000000 * ; >gmt windows-1601 (time-) 10000000 * >integer ;
: windows-time>FILETIME ( n -- FILETIME ) : windows-time>FILETIME ( n -- FILETIME )
"FILETIME" <c-object> "FILETIME" <c-object>

View File

@ -3,7 +3,8 @@
IN: xml-rpc IN: xml-rpc
USING: kernel xml arrays math generic http.client combinators USING: kernel xml arrays math generic http.client combinators
hashtables namespaces io base64 sequences strings calendar hashtables namespaces io base64 sequences strings calendar
xml.data xml.writer xml.utilities assocs math.parser debugger ; xml.data xml.writer xml.utilities assocs math.parser debugger
calendar.format ;
! * Sending RPC requests ! * Sending RPC requests
! TODO: time ! TODO: time