A Stream object is represented as a list whose last element contains the wherewithal to create the next element, should it ever be required.
Let ints be the infinite stream of non-negative integers.
ints := [i for i in 0..]
[0,1,2,3,4,5,6,7,8,9,...]
Type: Stream NonNegativeInteger
By default, ten stream elements are calculated. This number may be changed to something else by the system command
)set streams calculate
More generally, you can construct a stream by specifying its initial value and a function which, when given an element, creates the next element.
f : List INT -> List INT
Type: Void
f x == [x.1 + x.2, x.1]
Type: Void
fibs := [i.2 for i in [generate(f,[1,1])]]
[1,1,2,3,5,8,13,21,34,55,...]
Type: Stream Integer
You can create the stream of odd non-negative integers by either filtering them from the integers, or by evaluating an expression for each integer.
[i for i in ints | odd? i]
[1,3,5,7,9,11,13,15,17,19,...]
Type: Stream NonNegativeInteger
odds := [2*i+1 for i in ints]
[1,3,5,7,9,11,13,15,17,19,...]
Type: Stream NonNegativeInteger
You can accumulate the initial segments of a stream using the scan operation.
scan(0,+,odds)
[1,4,9,16,25,36,49,64,81,100,...]
Type: Stream NonNegativeInteger
The corresponding elements of two or more streams can be combined in this way.
[i*j for i in ints for j in odds]
[0,3,10,21,36,55,78,105,136,171,...]
Type: Stream NonNegativeInteger
map(*,ints,odds)
[0,3,10,21,36,55,78,105,136,171,...]
Type: Stream NonNegativeInteger
Many operations similar to those applicable to lists are available for :: streams.
- first ints
- 0
- Type: NonNegativeInteger
- rest ints
- [1,2,3,4,5,6,7,8,9,10,...]
- Type: Stream NonNegativeInteger
- fibs 20
- 6765
- Type: PositiveInteger
See Also: