SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

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
 

La actualidad más candente (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
 

Destacado (6)

VA Smalltalk Going Forward
VA Smalltalk Going ForwardVA Smalltalk Going Forward
VA Smalltalk Going Forward
 
Unanticipated Partial Behavioral Reflection
Unanticipated Partial Behavioral ReflectionUnanticipated Partial Behavioral Reflection
Unanticipated Partial Behavioral Reflection
 
LOOP
LOOPLOOP
LOOP
 
A Glimpse at Pomodoro
A Glimpse at PomodoroA Glimpse at Pomodoro
A Glimpse at Pomodoro
 
Change-Oriented Software Engineering
Change-Oriented Software EngineeringChange-Oriented Software Engineering
Change-Oriented Software Engineering
 
Slaps - a Smalltalk LDAP server
Slaps - a Smalltalk LDAP serverSlaps - a Smalltalk LDAP server
Slaps - a Smalltalk LDAP server
 

Similar a Xtreams

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
 

Similar a Xtreams (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
 

Más de ESUG

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programming
ESUG
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and Roadmap
ESUG
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...
ESUG
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early results
ESUG
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
ESUG
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test Generation
ESUG
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic Programming
ESUG
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
ESUG
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience Report
ESUG
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIs
ESUG
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
ESUG
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and Future
ESUG
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and Transformations
ESUG
 

Más de ESUG (20)

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programming
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in Pharo
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and Roadmap
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in Pharo
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early results
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test Generation
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic Programming
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience Report
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIs
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector Tuning
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and Future
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the Debugger
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing Score
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design Mooc
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and Transformations
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 

Xtreams

  • 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