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

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 8Nikita Popov
 
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.0Eyal Vardi
 
Practical basics on c++
Practical basics on c++Practical basics on c++
Practical basics on c++Marco Izzotti
 
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
 
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?Nikita Popov
 
Ruby on rails tips
Ruby  on rails tipsRuby  on rails tips
Ruby on rails tipsBinBin He
 
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)Nikita Popov
 
Cs1123 11 pointers
Cs1123 11 pointersCs1123 11 pointers
Cs1123 11 pointersTAlha MAlik
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?FITC
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of GoFrank Müller
 
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?"Fwdays
 
SNP STEAM Academy 2017 Class #12
SNP STEAM Academy 2017 Class #12SNP STEAM Academy 2017 Class #12
SNP STEAM Academy 2017 Class #12Markus Van Kempen
 
Cython - close to metal Python
Cython - close to metal PythonCython - close to metal Python
Cython - close to metal PythonTaras Lyapun
 

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

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

En vedette (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
 

Similaire à Xtreams

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)Saifur Rahman
 
Ruby and Rails by example
Ruby and Rails by exampleRuby and Rails by example
Ruby and Rails by examplebryanbibat
 
Type safe embedded domain-specific languages
Type safe embedded domain-specific languagesType safe embedded domain-specific languages
Type safe embedded domain-specific languagesArthur Xavier
 
Twisted logic
Twisted logicTwisted logic
Twisted logicashfall
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingMuthu Vinayagam
 
Dataflow: Declarative concurrency in Ruby
Dataflow: Declarative concurrency in RubyDataflow: Declarative concurrency in Ruby
Dataflow: Declarative concurrency in RubyLarry Diehl
 
Ruby Language - A quick tour
Ruby Language - A quick tourRuby Language - A quick tour
Ruby Language - A quick touraztack
 
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 TypesPhilip Schwarz
 
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 LineMatt Provost
 
Learn python in 20 minutes
Learn python in 20 minutesLearn python in 20 minutes
Learn python in 20 minutesSidharth Nadhan
 
Pharo Hands-On: 02 syntax
Pharo Hands-On: 02 syntaxPharo Hands-On: 02 syntax
Pharo Hands-On: 02 syntaxPharo
 
Advanced Patterns with io.ReadWriter
Advanced Patterns with io.ReadWriterAdvanced Patterns with io.ReadWriter
Advanced Patterns with io.ReadWriterWeaveworks
 
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) ThingsMichael Pirnat
 
CS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesCS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesEelco Visser
 
Dynamic languages, for software craftmanship group
Dynamic languages, for software craftmanship groupDynamic languages, for software craftmanship group
Dynamic languages, for software craftmanship groupReuven Lerner
 
Pharo: Syntax in a Nutshell
Pharo: Syntax in a NutshellPharo: Syntax in a Nutshell
Pharo: Syntax in a NutshellMarcus Denker
 
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)bryanbibat
 
Refactor like a boss
Refactor like a bossRefactor like a boss
Refactor like a bossgsterndale
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Coxlachie
 

Similaire à 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
 

Plus 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 programmingESUG
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in PharoESUG
 
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 RoadmapESUG
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoESUG
 
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 resultsESUG
 
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 6ESUG
 
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 GenerationESUG
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingESUG
 
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 ModesESUG
 
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 ReportESUG
 
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 APIsESUG
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector TuningESUG
 
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 CaseESUG
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FutureESUG
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the DebuggerESUG
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing ScoreESUG
 
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 JavaScriptESUG
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocESUG
 
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 TransformationsESUG
 

Plus 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
 

Dernier

A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
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 productivityPrincipled Technologies
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
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 DevelopmentsTrustArc
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
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...Drew Madelung
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
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...apidays
 
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 textsMaria Levchenko
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 

Dernier (20)

A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
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
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
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
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
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...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
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...
 
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
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 

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