SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Xtreams




Martin Kobetic
Cincom Smalltalk Development



ESUG Barcelona
September 2010
Why?
 * more consistency
 * de-emphasize positionability
 * strict separation between read and write streams
 * scalability
 * transformations / stacking
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
ReadStream
get               next
read:             next:
read:into:         next:into:startingAt: 1
read:into:at:      next:into:startingAt:
rest              upToEnd
source

(iteration)
do:, collect:, select:, ...
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 ]
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:
WriteStream - Examples
output := String new writing.
output write: ’Hello World’.
output close.
output terminal.

String new writing
   write: 5 from: ’Hello World’ reading;
   conclusion.
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
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
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.
Terminals - Examples - CPointers
buffer := CIntegerType char malloc: 50.
[ buffer writing
     length: 50;
     write: ’Hello World!’.
   buffer reading
     contentsSpecies: ByteString;
     read: 12
] ensure: [ buffer free ]
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:
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.
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
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.
Transforms - Examples - Morse Code
Message

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

Decoding Tree

       - << * >> .
     T          E
   M     N     A   I
  O G K D W R U S
   QZYCXBJP L FVH
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
Transforms - Morse Code Encoding
(String new writing
  transforming: [ :in :out |
      out write: (Morse at: in get);
        put: $ ]
) write: ’ESUG BARCELONA MMX’;
  close;
  terminal
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 get.
      messages put: message rest
   ] repeat
] on: Incomplete do: [].
messages conclusion.

output := String new writing.
(output limiting: 40) write: Object comment.
output conclusion.
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
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 ].
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
Positioning
Non-positionable streams

  ++
  -= 0



Positionable streams

  position / position:
  available / length
  ++ / --
  += / -=
  explore:
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.
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)).
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
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
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
Topics Not Covered
* interpreting
* marshaling
* parsing
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
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/

Code:
  http://www.cincomsmalltalk.com/publicRepository/
  XtreamsDevelopment(Bundle).html

Contenu connexe

Tendances

Chapter 7 - Input Output Statements in C++
Chapter 7 - Input Output Statements in C++Chapter 7 - Input Output Statements in C++
Chapter 7 - Input Output Statements in C++
Deepak Singh
 
Cs1123 11 pointers
Cs1123 11 pointersCs1123 11 pointers
Cs1123 11 pointers
TAlha MAlik
 

Tendances (20)

Just-In-Time Compiler in PHP 8
Just-In-Time Compiler in PHP 8Just-In-Time Compiler in PHP 8
Just-In-Time Compiler in PHP 8
 
What\'s New in C# 4.0
What\'s New in C# 4.0What\'s New in C# 4.0
What\'s New in C# 4.0
 
Format String Exploitation
Format String ExploitationFormat String Exploitation
Format String Exploitation
 
Practical basics on c++
Practical basics on c++Practical basics on c++
Practical basics on c++
 
Chapter 7 - Input Output Statements in C++
Chapter 7 - Input Output Statements in C++Chapter 7 - Input Output Statements in C++
Chapter 7 - Input Output Statements in C++
 
What's new in PHP 8.0?
What's new in PHP 8.0?What's new in PHP 8.0?
What's new in PHP 8.0?
 
string , pointer
string , pointerstring , pointer
string , pointer
 
Ruby on rails tips
Ruby  on rails tipsRuby  on rails tips
Ruby on rails tips
 
Static Optimization of PHP bytecode (PHPSC 2017)
Static Optimization of PHP bytecode (PHPSC 2017)Static Optimization of PHP bytecode (PHPSC 2017)
Static Optimization of PHP bytecode (PHPSC 2017)
 
Format String
Format StringFormat String
Format String
 
Cs1123 11 pointers
Cs1123 11 pointersCs1123 11 pointers
Cs1123 11 pointers
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?
 
ProgrammingwithGOLang
ProgrammingwithGOLangProgrammingwithGOLang
ProgrammingwithGOLang
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of Go
 
Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"
 
Introduction to TypeScript
Introduction to TypeScriptIntroduction to TypeScript
Introduction to TypeScript
 
SNP STEAM Academy 2017 Class #12
SNP STEAM Academy 2017 Class #12SNP STEAM Academy 2017 Class #12
SNP STEAM Academy 2017 Class #12
 
Introduction to TypeScript
Introduction to TypeScriptIntroduction to TypeScript
Introduction to TypeScript
 
Rust言語紹介
Rust言語紹介Rust言語紹介
Rust言語紹介
 
Cython - close to metal Python
Cython - close to metal PythonCython - close to metal Python
Cython - close to metal Python
 

En vedette (7)

Maycafotos2 eviita
Maycafotos2 eviitaMaycafotos2 eviita
Maycafotos2 eviita
 
Jane Austen Can Get You A Job
Jane Austen Can Get You A JobJane Austen Can Get You A Job
Jane Austen Can Get You A Job
 
Pts
PtsPts
Pts
 
WordCamp Utah 2010 Presentation
WordCamp Utah 2010 PresentationWordCamp Utah 2010 Presentation
WordCamp Utah 2010 Presentation
 
Maycafotos2 eviita
Maycafotos2 eviitaMaycafotos2 eviita
Maycafotos2 eviita
 
Secure Communications with VisualWorks - CSTUC 2006
Secure Communications with VisualWorks - CSTUC 2006Secure Communications with VisualWorks - CSTUC 2006
Secure Communications with VisualWorks - CSTUC 2006
 
Cryptography for Smalltalkers 2 - ESUG 2006
Cryptography for Smalltalkers 2 - ESUG 2006Cryptography for Smalltalkers 2 - ESUG 2006
Cryptography for Smalltalkers 2 - ESUG 2006
 

Similaire à Xtreams - ESUG 2010

Twisted logic
Twisted logicTwisted logic
Twisted logic
ashfall
 
Ruby Language - A quick tour
Ruby Language - A quick tourRuby Language - A quick tour
Ruby Language - A quick tour
aztack
 

Similaire à Xtreams - ESUG 2010 (20)

C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)
 
Python crush course
Python crush coursePython crush course
Python crush course
 
Ruby and Rails by example
Ruby and Rails by exampleRuby and Rails by example
Ruby and Rails by example
 
Type safe embedded domain-specific languages
Type safe embedded domain-specific languagesType safe embedded domain-specific languages
Type safe embedded domain-specific languages
 
Twisted logic
Twisted logicTwisted logic
Twisted logic
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python Programming
 
Dataflow: Declarative concurrency in Ruby
Dataflow: Declarative concurrency in RubyDataflow: Declarative concurrency in Ruby
Dataflow: Declarative concurrency in Ruby
 
Ruby Language - A quick tour
Ruby Language - A quick tourRuby Language - A quick tour
Ruby Language - A quick tour
 
Abstracting over Execution with Higher Kinded Types
Abstracting over Execution with Higher Kinded TypesAbstracting over Execution with Higher Kinded Types
Abstracting over Execution with Higher Kinded Types
 
Rust LDN 24 7 19 Oxidising the Command Line
Rust LDN 24 7 19 Oxidising the Command LineRust LDN 24 7 19 Oxidising the Command Line
Rust LDN 24 7 19 Oxidising the Command Line
 
Learn python in 20 minutes
Learn python in 20 minutesLearn python in 20 minutes
Learn python in 20 minutes
 
Pharo Hands-On: 02 syntax
Pharo Hands-On: 02 syntaxPharo Hands-On: 02 syntax
Pharo Hands-On: 02 syntax
 
Advanced Patterns with io.ReadWriter
Advanced Patterns with io.ReadWriterAdvanced Patterns with io.ReadWriter
Advanced Patterns with io.ReadWriter
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) Things
 
CS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesCS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic Services
 
Dynamic languages, for software craftmanship group
Dynamic languages, for software craftmanship groupDynamic languages, for software craftmanship group
Dynamic languages, for software craftmanship group
 
Pharo: Syntax in a Nutshell
Pharo: Syntax in a NutshellPharo: Syntax in a Nutshell
Pharo: Syntax in a Nutshell
 
Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)
 
Refactor like a boss
Refactor like a bossRefactor like a boss
Refactor like a boss
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Cox
 

Dernier

The basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxThe basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptx
heathfieldcps1
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
QucHHunhnh
 
Making and Justifying Mathematical Decisions.pdf
Making and Justifying Mathematical Decisions.pdfMaking and Justifying Mathematical Decisions.pdf
Making and Justifying Mathematical Decisions.pdf
Chris Hunter
 
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in DelhiRussian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
kauryashika82
 

Dernier (20)

Application orientated numerical on hev.ppt
Application orientated numerical on hev.pptApplication orientated numerical on hev.ppt
Application orientated numerical on hev.ppt
 
microwave assisted reaction. General introduction
microwave assisted reaction. General introductionmicrowave assisted reaction. General introduction
microwave assisted reaction. General introduction
 
The basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxThe basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptx
 
Nutritional Needs Presentation - HLTH 104
Nutritional Needs Presentation - HLTH 104Nutritional Needs Presentation - HLTH 104
Nutritional Needs Presentation - HLTH 104
 
Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdf
 
Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024
 
Unit-IV; Professional Sales Representative (PSR).pptx
Unit-IV; Professional Sales Representative (PSR).pptxUnit-IV; Professional Sales Representative (PSR).pptx
Unit-IV; Professional Sales Representative (PSR).pptx
 
Key note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfKey note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdf
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
 
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptxINDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
 
Unit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxUnit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptx
 
Python Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docxPython Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docx
 
Ecological Succession. ( ECOSYSTEM, B. Pharmacy, 1st Year, Sem-II, Environmen...
Ecological Succession. ( ECOSYSTEM, B. Pharmacy, 1st Year, Sem-II, Environmen...Ecological Succession. ( ECOSYSTEM, B. Pharmacy, 1st Year, Sem-II, Environmen...
Ecological Succession. ( ECOSYSTEM, B. Pharmacy, 1st Year, Sem-II, Environmen...
 
Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy Consulting
 
Making and Justifying Mathematical Decisions.pdf
Making and Justifying Mathematical Decisions.pdfMaking and Justifying Mathematical Decisions.pdf
Making and Justifying Mathematical Decisions.pdf
 
Asian American Pacific Islander Month DDSD 2024.pptx
Asian American Pacific Islander Month DDSD 2024.pptxAsian American Pacific Islander Month DDSD 2024.pptx
Asian American Pacific Islander Month DDSD 2024.pptx
 
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17  How to Extend Models Using Mixin ClassesMixin Classes in Odoo 17  How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot Graph
 
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in DelhiRussian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
Russian Escort Service in Delhi 11k Hotel Foreigner Russian Call Girls in Delhi
 

Xtreams - ESUG 2010

  • 1. Xtreams Martin Kobetic Cincom Smalltalk Development ESUG Barcelona September 2010
  • 2. Why? * more consistency * de-emphasize positionability * strict separation between read and write streams * scalability * transformations / stacking
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Transforms - Morse Code Encoding (String new writing transforming: [ :in :out | out write: (Morse at: in get); put: $ ] ) write: ’ESUG BARCELONA MMX’; close; terminal
  • 19. Substreams size limiting: 10 bounding criteria ending: $a ending: [ :e | ’abc’ includes: e ] ending: ’the end’
  • 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. 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. 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. 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. Positioning Non-positionable streams ++ -= 0 Positionable streams position / position: available / length ++ / -- += / -= explore:
  • 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. 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. 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. 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. 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. Topics Not Covered * interpreting * marshaling * parsing
  • 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. Future Directions * use => fix bugs, inconsistencies * ending: aPattern * xml processing * backward compatibility layer
  • 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