Xtreams




Martin Kobetic
Cincom Smalltalk Development



ESUG Barcelona
September 2010
Why?
 * more consistency
 * de-emphasize positionability
 * strict separation between read and write streams
 * scalabilit...
Basics
Terminal: collection, socket, file, ...

Read Stream: source, get, read:, ...

Write Stream: destination, put:, wri...
ReadStream
get               next
read:             next:
read:into:         next:into:startingAt: 1
read:into:at:      ne...
ReadStream - Examples
input := ’hello world’ reading.
input get.
input read: 4.
input rest.
input get.

current := ObjectM...
WriteStream
put:              nextPut:
write:            nextPutAll:
write:from:         next:putAll:startingAt: 1
write:f...
WriteStream - Examples
output := String new writing.
output write: ’Hello World’.
output close.
output terminal.

String n...
Terminals
Collections:
  (1 to: 100) reading       |   String new writing

Blocks:
  [ ] reading           |       [ :x | ...
Terminals - Examples - Blocks
a := 0. b := 1.
fib := [ | x | x := a. a := b. b := b + x. x ] reading.
fib ++ 99; get.

poi...
Terminals - Examples - Pipes
[ :in :out |
    [ out writing write: ’Hello’; close.
       in reading read: 5
    ] ensure:...
Terminals - Examples - CPointers
buffer := CIntegerType char malloc: 50.
[ buffer writing
     length: 50;
     write: ’He...
Transforms
Collection Style:
  collecting:, selecting:, injecting:into:, doing:, ...

Specialized Transforms:
  encoding:,...
Transforms - Examples - Collection Style
random := Random new reading.
random := random collecting: [ :f | (f * 256) floor...
Transforms - Examples - Character Encoding
input := ’xtreams.cha’ asFilename reading.
input := input encoding: ’utf8’.
inp...
Transforms - Examples - Cryptographic
(ObjectMemory imageFilename reading hashing: ’md5’)
  -= 0; close; digest.

key := r...
Transforms - Examples - Morse Code
Message

  . ... ..- --. -... .- .-. -.-. . .-.. --- -. .- -- -- -..-

Decoding Tree

 ...
Transforms - Morse Code Decoding
(’. ... ..- --. -... .- .-. -.-. . .-.. --- -. .- -- -- -..- ’ reading
    transforming: ...
Transforms - Morse Code Encoding
(String new writing
  transforming: [ :in :out |
      out write: (Morse at: in get);
   ...
Substreams
size
   limiting: 10

bounding criteria
  ending: $a
  ending: [ :e | ’abc’ includes: e ]
  ending: ’the end’
Substreams - limiting:
input := (1 to: 50) reading.
messages := Array new writing.
[ [ message := input limiting: input ge...
Substreams - ending:
(Object comment reading
  ending: $. inclusive: true) rest.
(Object comment reading
  ending: [ :e | ...
Substreams - Slicers
input := [ 1 ] reading.
slicer := input limiter: 10.
slice := slicer get.
slice rest.

input := ’aaa#...
Substreams - Slicers - Writing
output := ByteArray new writing.
slicer := output limiter: 3.
1 to: 10 do: [ :i |
   [ slic...
Positioning
Non-positionable streams

  ++
  -= 0



Positionable streams

  position / position:
  available / length
  +...
Positioning - Examples
input := ’Hello World!’ reading.
input -= 6; rest.
input += 6; rest.

output := String new writing....
Positioning Non-positionable Streams
a := 5. b := 10.
input := [
   (a := a + 1) < b ifFalse: [ Incomplete zero raise ].
 ...
Positioning Non-positionable Streams
output := self newBottomWriter positioning.
output buffer: (RingBuffer on: (String ne...
Positioning - Exploring
separators := ’.!?’ withCRs.
lines := Array new writing.
(Object comment reading
   ender: [ :c | ...
Main Differences
* strictly separated read and write
* stream composition/stacking
* stream end handling
   * reading/skip...
Topics Not Covered
* interpreting
* marshaling
* parsing
Project Structure
Core: defines the API and core classes

Terminals: streams for all supported terminals

Transforms: core...
Future Directions
* use => fix bugs, inconsistencies
* ending: aPattern
* xml processing
* backward compatibility layer
References
Project Members:
  Michael Lucas-Smith
  Martin Kobetic

Project Site:
  http://code.google.com/p/xtreams/

Cod...
Upcoming SlideShare
Loading in...5
×

Xtreams

892
-1

Published on

Martin Kobetic: Xtreams. ESUG 2010, Barcelona, Spain

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
892
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Xtreams

  1. 1. Xtreams Martin Kobetic Cincom Smalltalk Development ESUG Barcelona September 2010
  2. 2. Why? * more consistency * de-emphasize positionability * strict separation between read and write streams * scalability * transformations / stacking
  3. 3. Basics Terminal: collection, socket, file, ... Read Stream: source, get, read:, ... Write Stream: destination, put:, write:, ... Transform: read or write collecting:, selecting:, ... character encoding, compression, marshaling, ... substreams & slicing
  4. 4. ReadStream get next read: next: read:into: next:into:startingAt: 1 read:into:at: next:into:startingAt: rest upToEnd source (iteration) do:, collect:, select:, ...
  5. 5. ReadStream - Examples input := ’hello world’ reading. input get. input read: 4. input rest. input get. current := ObjectMemory someObject. [ current := ObjectMemory nextObjectAfter: current. current == 0 ifTrue: [Incomplete zero raise]. current ] reading inject: 0 into: [ :c :e | c + 1 ]
  6. 6. WriteStream put: nextPut: write: nextPutAll: write:from: next:putAll:startingAt: 1 write:from:at: next:putAll:startingAt: destination (positionables) insert: insert:from: insert:from:at:
  7. 7. WriteStream - Examples output := String new writing. output write: ’Hello World’. output close. output terminal. String new writing write: 5 from: ’Hello World’ reading; conclusion.
  8. 8. Terminals Collections: (1 to: 100) reading | String new writing Blocks: [ ] reading | [ :x | ] writing Files: ObjectMemory imageFilename reading Sockets & Pipes: Stdin reading | Stdout writing Buffers & SharedQueues: buffer := RingBuffer new: 4. in := buffer writing. out := buffer reading. CPointers
  9. 9. Terminals - Examples - Blocks a := 0. b := 1. fib := [ | x | x := a. a := b. b := b + x. x ] reading. fib ++ 99; get. point := 20 @ 20. [ :x | x printString asComposedText displayOn: builder window graphicsContext at: (point := point + (0@20)) ] writing write: 30 from: fib
  10. 10. Terminals - Examples - Pipes [ :in :out | [ out writing write: ’Hello’; close. in reading read: 5 ] ensure: [ in close. out close ] ] valueWithArguments: UnixPipeAccessor openPair. Stdout writing write: ’Hello’; flush. Stdin reading get.
  11. 11. Terminals - Examples - CPointers buffer := CIntegerType char malloc: 50. [ buffer writing length: 50; write: ’Hello World!’. buffer reading contentsSpecies: ByteString; read: 12 ] ensure: [ buffer free ]
  12. 12. Transforms Collection Style: collecting:, selecting:, injecting:into:, doing:, ... Specialized Transforms: encoding:, encodingBase64, compressing, en/decrypting:key:iv:, hashing: interpreting:, marshaling General Transforms: transforming: [ :in :out | ... ] Substreams: ending:(inclusive:), limiting:
  13. 13. Transforms - Examples - Collection Style random := Random new reading. random := random collecting: [ :f | (f * 256) floor ]. random contentsSpecies: ByteArray. sieve := OrderedCollection new. ones := [ 1 ] reading. twoAndUp := ones injecting: 1 into: [ :previous :one | previous + one ]. primes := twoAndUp rejecting: [ :i | (sieve anySatisfy: [ :p | i p = 0 ]) ifTrue: [ true ] ifFalse: [ sieve add: i. false ] ]. primes read: 10.
  14. 14. Transforms - Examples - Character Encoding input := ’xtreams.cha’ asFilename reading. input := input encoding: ’utf8’. input read: 50. input close. input := ’xtreams.cha’ asFilename reading. input contentsSpecies: String. (#[13 10 10 13] reading encoding: #ascii) rest. (ByteArray new writing encoding: #ascii) cr; conclusion
  15. 15. Transforms - Examples - Cryptographic (ObjectMemory imageFilename reading hashing: ’md5’) -= 0; close; digest. key := random read: 16. ((String new writing encodingBase64 encrypting: ’aes-128-ecb’ key: key iv: nil) compressing encoding: #utf8 ) write: Object comment; conclusion.
  16. 16. Transforms - Examples - Morse Code Message . ... ..- --. -... .- .-. -.-. . .-.. --- -. .- -- -- -..- Decoding Tree - << * >> . T E M N A I O G K D W R U S QZYCXBJP L FVH
  17. 17. Transforms - Morse Code Decoding (’. ... ..- --. -... .- .-. -.-. . .-.. --- -. .- -- -- -..- ’ reading transforming: [ :in :out || node beep | node := MorseTree. [ beep := in get. beep = $ ] whileFalse: [ node := beep = $. ifTrue: [ node at: 3 ] ifFalse: [ node at: 2 ] ]. out put: node first ] ) rest
  18. 18. Transforms - Morse Code Encoding (String new writing transforming: [ :in :out | out write: (Morse at: in get); put: $ ] ) write: ’ESUG BARCELONA MMX’; close; terminal
  19. 19. Substreams size limiting: 10 bounding criteria ending: $a ending: [ :e | ’abc’ includes: e ] ending: ’the end’
  20. 20. Substreams - limiting: input := (1 to: 50) reading. messages := Array new writing. [ [ message := input limiting: input get. messages put: message rest ] repeat ] on: Incomplete do: []. messages conclusion. output := String new writing. (output limiting: 40) write: Object comment. output conclusion.
  21. 21. Substreams - ending: (Object comment reading ending: $. inclusive: true) rest. (Object comment reading ending: [ :e | ’.!?’ includes: e ]) rest. (Object comment reading ending: ’Class Variables:’) rest. output := String new writing. Number withAllSubclasses do: [ :class | [ (output ending: $. inclusive: true) write: class comment ] on: Incomplete do: []. output cr ]. output conclusion
  22. 22. Substreams - Slicers input := [ 1 ] reading. slicer := input limiter: 10. slice := slicer get. slice rest. input := ’aaa#bb#c##!1#22#33#444’ reading. messages := input ender: $!. parts := messages get ender: $#. parts collect: [ :p | p rest ].
  23. 23. Substreams - Slicers - Writing output := ByteArray new writing. slicer := output limiter: 3. 1 to: 10 do: [ :i | [ slicer get write: (ByteArray new: 10 withAll: i) ] on: Incomplete do: [] ]. output conclusion. output := String new writing. messages := output closer: [ output put: $! ]. #((aa bb cc dd ee) (xxx yy z)) do: [ :m | message := messages get. parts := message closer: [ message put: $# ]. m do: [ :p | parts get write: p ] ]. output conclusion
  24. 24. Positioning Non-positionable streams ++ -= 0 Positionable streams position / position: available / length ++ / -- += / -= explore:
  25. 25. Positioning - Examples input := ’Hello World!’ reading. input -= 6; rest. input += 6; rest. output := String new writing. output write: ’Hello World!’. output += 5; insert: ’, Hello’. output -= 0; conclusion. output -= 6; write: ’Earth!’. output conclusion.
  26. 26. Positioning Non-positionable Streams a := 5. b := 10. input := [ (a := a + 1) < b ifFalse: [ Incomplete zero raise ]. a ] reading. input ++ 2; get. input -= 0; rest. input := Random new reading positioning. input read: 5. input += 0; read: 10. input buffer: (RingBuffer on: (Array new: 5)).
  27. 27. Positioning Non-positionable Streams output := self newBottomWriter positioning. output buffer: (RingBuffer on: (String new: 10)). output write: ’Hello, World!’. output -= 6; write: ’Earth!’. output flush
  28. 28. Positioning - Exploring separators := ’.!?’ withCRs. lines := Array new writing. (Object comment reading ender: [ :c | separators includes: c ] ) do: [ :s || line | line := s positioning. (line explore: [ [ (line read: 6) = ’Object’ ] on: Incomplete do: [ :ex | false ] ] ) ifTrue: [ lines put: line rest ] ]. lines conclusion
  29. 29. Main Differences * strictly separated read and write * stream composition/stacking * stream end handling * reading/skipping past end => exception * no #atEnd -> other patterns #rest, iteration [ stream atEnd ] whileFalse: [ ... ] [ [ ... ] repeat ] on: Incomplete do: []. * slimmer API, use composition * #peek -> #explore: [] * #upToAll: -> ( #ending: ) rest
  30. 30. Topics Not Covered * interpreting * marshaling * parsing
  31. 31. Project Structure Core: defines the API and core classes Terminals: streams for all supported terminals Transforms: core transform streams Substreams: streams embedded in other streams (slicing) Xtras: non-core transforms Parsing: PEG parsing
  32. 32. Future Directions * use => fix bugs, inconsistencies * ending: aPattern * xml processing * backward compatibility layer
  33. 33. References Project Members: Michael Lucas-Smith Martin Kobetic Project Site: http://code.google.com/p/xtreams/ Code: http://www.cincomsmalltalk.com/publicRepository/ XtreamsDevelopment(Bundle).html
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×