promises: fix for syntax change and simplify a little bit

db4
Slava Pestov 2009-03-22 21:42:01 -05:00
parent 69bf52c2a6
commit 353788190d
2 changed files with 10 additions and 43 deletions

View File

@ -1,34 +1,20 @@
! Copyright (C) 2006 Chris Double. ! Copyright (C) 2006 Chris Double.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: help.markup help.syntax ; USING: help.markup help.syntax ;
IN: promises IN: promises
HELP: promise HELP: promise
{ $values { "quot" { $quotation "( -- X )" } } { "promise" "a promise object" } } { $values { "quot" { $quotation "( -- X )" } } { "promise" "a promise object" } }
{ $description "Creates a promise to return a value. When forced this quotation is called and the value returned. The value is memorised so that calling " { $link force } " again does not call the quotation again, instead the previous value is returned directly." } { $description "Creates a promise to return a value. When forced this quotation is called and the value returned. The value is memorised so that calling " { $link force } " again does not call the quotation again, instead the previous value is returned directly." } ;
{ $see-also force promise-with promise-with2 } ;
HELP: promise-with
{ $values { "value" "an object" } { "quot" { $quotation "( value -- X )" } } { "promise" "a promise object" } }
{ $description "Creates a promise to return a value. When forced this quotation is called with the given value on the stack and the result returned. The value is memorised so that calling " { $link force } " again does not call the quotation again, instead the previous value is returned directly." }
{ $see-also force promise promise-with2 } ;
HELP: promise-with2
{ $values { "value1" "an object" } { "value2" "an object" } { "quot" { $quotation "( value1 value2 -- X )" } } { "promise" "a promise object" } }
{ $description "Creates a promise to return a value. When forced this quotation is called with the given values on the stack and the result returned. The value is memorised so that calling " { $link force } " again does not call the quotation again, instead the previous value is returned directly." }
{ $see-also force promise promise-with2 } ;
HELP: force HELP: force
{ $values { "promise" "a promise object" } { "value" "a factor object" } } { $values { "promise" "a promise object" } { "value" "a factor object" } }
{ $description "Calls the quotation associated with the promise if it has not been called before, and returns the value. If the promise has been forced previously, returns the value from the previous call." } { $description "Calls the quotation associated with the promise if it has not been called before, and returns the value. If the promise has been forced previously, returns the value from the previous call." } ;
{ $see-also promise promise-with promise-with2 } ;
HELP: LAZY: HELP: LAZY:
{ $syntax "LAZY: word definition... ;" } { $syntax "LAZY: word ( stack -- effect ) definition... ;" }
{ $values { "word" "a new word to define" } { "definition" "a word definition" } } { $values { "word" "a new word to define" } { "definition" "a word definition" } }
{ $description "Creates a lazy word in the current vocabulary. When executed the word will return a " { $link promise } " that when forced, executes the word definition. Any values on the stack that are required by the word definition are captured along with the promise." } { $description "Creates a lazy word in the current vocabulary. When executed the word will return a " { $link promise } " that when forced, executes the word definition. Any values on the stack that are required by the word definition are captured along with the promise." }
{ $examples { $examples
{ $example "USING: arrays sequences prettyprint promises ;" "IN: scratchpad" "LAZY: zeroes ( -- pair ) 0 zeroes 2array ;" "zeroes force second force first ." "0" } { $example "USING: arrays sequences prettyprint promises ;" "IN: scratchpad" "LAZY: zeroes ( -- pair ) 0 zeroes 2array ;" "zeroes force second force first ." "0" }
} } ;
{ $see-also force promise-with promise-with2 } ;

View File

@ -1,41 +1,22 @@
! Copyright (C) 2004, 2006 Chris Double, Matthew Willis. ! Copyright (C) 2004, 2006 Chris Double, Matthew Willis.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: arrays kernel sequences math vectors arrays namespaces USING: arrays kernel sequences math arrays namespaces
make quotations parser effects stack-checker words accessors ; parser effects generalizations fry words accessors ;
IN: promises IN: promises
TUPLE: promise quot forced? value ; TUPLE: promise quot forced? value ;
: promise ( quot -- promise ) : promise ( quot -- promise ) f f \ promise boa ;
f f \ promise boa ;
: promise-with ( value quot -- promise )
curry promise ;
: promise-with2 ( value1 value2 quot -- promise )
2curry promise ;
: force ( promise -- value ) : force ( promise -- value )
#! Force the given promise leaving the value of calling the
#! promises quotation on the stack. Re-forcing the promise
#! will return the same value and not recall the quotation.
dup forced?>> [ dup forced?>> [
dup quot>> call( -- value ) >>value dup quot>> call( -- value ) >>value
t >>forced? t >>forced?
] unless ] unless
value>> ; value>> ;
: stack-effect-in ( quot word -- n ) : make-lazy-quot ( quot effect -- quot )
stack-effect [ ] [ infer ] ?if in>> length ; in>> length '[ _ _ ncurry promise ] ;
: make-lazy-quot ( word quot -- quot )
[
dup ,
swap stack-effect-in \ curry <repetition> %
\ promise ,
] [ ] make ;
SYNTAX: LAZY: SYNTAX: LAZY:
CREATE-WORD (:) [ make-lazy-quot ] [ 2nip ] 3bi define-declared ;
dup parse-definition
make-lazy-quot define ;