Re: [Pharo-users] Pharo and QT
As long as your having fun yourself, sounds like a good idea. If you manage a minimum viable product like example code, wider interest may arise. Good luck. cheers -ben On Sat, Jun 3, 2017 at 4:00 AM, Dimitris Chloupis wrote: > There is a way to make this into a small task > > One of my experiments of testing my Pharo to Python bridge (What I have > named project "Atlas") was to build a QT hello world example. It created a > problem because I was using python threads that QT does not like (it offers > its own kind of threads) but after changing the code to use no threads, it > worked. > > My bridge is not like UFFI where anything has to be wrapped because unlike > C , Python is a dynamic language so there is no need for wrappers because > Atlas allows dynamic execution of code. But of course there is the issues > of data types and how they can be mapped to Pharo and the fact that PyQT > free version is GPL and commercial is 500 dollars which sits of course on > top of the commercial version of QT. So at the time I decided to not pursue > it. > > I will give it a try and see how far it can goes, at worst I may offer a > partial solution to using QT with Pharo. Then someone else can take it from > there if there is genuine interest and expand it to more features. > > On Fri, Jun 2, 2017 at 12:01 AM Stephane Ducasse > wrote: > >> Hi dimitris >> >> We would love to have that. We could have a Spec binding and build >> automatically applications in QT for people willing. >> Esteban always wanted to have a Cocoa binding used the same way. >> But this is large task >> >> Stef >> >> On Thu, Jun 1, 2017 at 2:44 PM, Hilaire wrote: >> >>> A must for any serious dekstop application with Pharo, but it is a hudge >>> task >>> >>> >>> Le 29/05/2017 à 14:35, Dimitris Chloupis a écrit : >>> > Is there an interest for working with QT from Pharo ? I make no >>> > promises just something I was interested in trying. >>> >>> -- >>> Dr. Geo >>> http://drgeo.eu >>> >>> >>> >>> >>
[Pharo-users] Analyzing Fuel Problem
I had an object graph that was pulling in all sorts of unrelated classes when serialized with Fuel. I was trying to find the offending object, and came up with the following: ``` (FLAnalyzer newDefault analysisFor: root) clusterization globalsBucket ``` This worked, but I was wondering if that's "the right way" to do it... Thanks. - Cheers, Sean -- View this message in context: http://forum.world.st/Analyzing-Fuel-Problem-tp4949104.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
Re: [Pharo-users] Deprecation Warning
Thanks ! -- View this message in context: http://forum.world.st/Deprecation-Warning-tp4949096p4949098.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
Re: [Pharo-users] Deprecation Warning
World>>System>>Settings Tools>>Debugging>>Deprecation handling Raise a blocking dialog if true, then a dialog is popup for each deprecated method invocation hth On Fri, Jun 2, 2017 at 7:28 PM, Georges wrote: > Hello, > > Is there somewhere a setting to turn off the Deprecation Warning debugger? > > Georges > > > > -- > View this message in context: http://forum.world.st/ > Deprecation-Warning-tp4949096.html > Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com. > > -- Bernardo E.C. Sent from a cheap desktop computer in South America.
[Pharo-users] Deprecation Warning
Hello, Is there somewhere a setting to turn off the Deprecation Warning debugger? Georges -- View this message in context: http://forum.world.st/Deprecation-Warning-tp4949096.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
Re: [Pharo-users] Porting Transducers to Pharo
Hi Stephane & Damien! The short answer is that the compact notation turned out to work much better for me in my code, especially, if multiple transducers are involved. But that's my personal taste. You can choose which suits you better. In fact, 1000 take. just sits on top and simply calls Take number: 1000. If the need arises, we could of course factor the compact notation out into a separate package. Btw, would you prefer (Take n: 1000) over (Take number: 1000)? Damien, you're right, I experimented with additional styles. Right now, we already have in the basic Transducer package: (collection transduce: #squared map * 1000 take. "which is equal to" (collection transduce: #squared map) transduce: 1000 take. Basically, one can split #transduce:reduce:init: into single calls of #transduce:, #reduce:, and #init:, depending on the needs. I also have an (unfinished) extension, that allows to write: (collection transduce map: #squared) take: 1000. This feels familiar, but becomes a bit hard to read if more than two steps are needed. collection transduce map: #squared; take: 1000. I think, this alternative would reads nicely. But as the message chain has to modify the underlying object (an eduction), very snaky side effects may occur. E.g., consider eduction := collection transduce. squared := eduction map: #squared. take := squared take: 1000. Now, all three variables hold onto the same object, which first squares all elements and than takes the first 1000. Best, Steffen Am .06.2017, 21:28 Uhr, schrieb Damien Pollet : If I recall correctly, there is an alternate protocol that looks more like xtreams or the traditional select/collect iterations. On 2 June 2017 at 21:12, Stephane Ducasse wrote: I have a design question why the library is implemented in functional style vs messages? I do not see why this is needed. To my eyes the compact notation goes against readibility of code and it feels ad-hoc in Smalltalk. I really prefer square := Map function: #squared. take := Take number: 1000. Because I know that I can read it and understand it. From that perspective I prefer Xtreams. Stef On Wed, May 31, 2017 at 2:23 PM, Steffen Märcker wrote: Hi, I am the developer of the library 'Transducers' for VisualWorks. It was formerly known as 'Reducers', but this name was a poor choice. I'd like to port it to Pharo, if there is any interest on your side. I hope to learn more about Pharo in this process, since I am mainly a VW guy. And most likely, I will come up with a bunch of questions. :-) Meanwhile, I'll cross-post the introduction from VWnc below. I'd be very happy to hear your optinions, questions and I hope we can start a fruitful discussion - even if there is not Pharo port yet. Best, Steffen Transducers are building blocks that encapsulate how to process elements of a data sequence independently of the underlying input and output source. # Overview ## Encapsulate Implementations of enumeration methods, such as #collect:, have the logic how to process a single element in common. However, that logic is reimplemented each and every time. Transducers make it explicit and facilitate re-use and coherent behavior. For example: - #collect: requires mapping: (aBlock1 map) - #select: requires filtering: (aBlock2 filter) ## Compose In practice, algorithms often require multiple processing steps, e.g., mapping only a filtered set of elements. Transducers are inherently composable, and hereby, allow to make the combination of steps explicit. Since transducers do not build intermediate collections, their composition is memory-efficient. For example: - (aBlock1 filter) * (aBlock2 map) "(1.) filter and (2.) map elements" ## Re-Use Transducers are decoupled from the input and output sources, and hence, they can be reused in different contexts. For example: - enumeration of collections - processing of streams - communicating via channels # Usage by Example We build a coin flipping experiment and count the occurrence of heads and tails. First, we associate random numbers with the sides of a coin. scale := [:x | (x * 2 + 1) floor] map. sides := #(heads tails) replace. Scale is a transducer that maps numbers x between 0 and 1 to 1 and 2. Sides is a transducer that replaces the numbers with heads an tails by lookup in an array. Next, we choose a number of samples. count := 1000 take. Count is a transducer that takes 1000 elements from a source. We keep track of the occurrences of heads an tails using a bag. collect := [:bag :c | bag add: c; yourself]. Collect is binary block (reducing function) that collects events in a bag. We assemble the experiment by transforming the block using the transducers. experiment := (scale * sides * count) transform: collect. From left to right we see the steps involved: scale, sides, count and c
Re: [Pharo-users] Porting Transducers to Pharo
Hi Stephane! This is a great news. We need cool frameworks. I am really curious how well it will work for others. =) - There is a package on cincom store to support the migration from VW to Pharo. FileOuter something. The name escapes my mind now. We updated it last year to help porting one application to Pharo. I think it is FileOuterNG (at least your name appears quit often in the commits ;-) ). Unfortunately, I didn't get it to work straight away and got some MNU. But it it is very likely, that this is my fault and I missed something important. I'll try it again later. - I can help producing a nice document :) Do you mean like the booklets published over the last weeks? This would be great. Do you have an idea, how to add a package comment to the simple file-out it used? I think, a simple message send should suffice. Cheers! Steffen Am .06.2017, 21:06 Uhr, schrieb Stephane Ducasse : Hi steffen On Wed, May 31, 2017 at 2:23 PM, Steffen Märcker wrote: Hi, I am the developer of the library 'Transducers' for VisualWorks. It was formerly known as 'Reducers', but this name was a poor choice. I'd like to port it to Pharo, if there is any interest on your side. I hope to learn more about Pharo in this process, since I am mainly a VW guy. And most likely, I will come up with a bunch of questions. :-) Meanwhile, I'll cross-post the introduction from VWnc below. I'd be very happy to hear your optinions, questions and I hope we can start a fruitful discussion - even if there is not Pharo port yet. Best, Steffen Transducers are building blocks that encapsulate how to process elements of a data sequence independently of the underlying input and output source. # Overview ## Encapsulate Implementations of enumeration methods, such as #collect:, have the logic how to process a single element in common. However, that logic is reimplemented each and every time. Transducers make it explicit and facilitate re-use and coherent behavior. For example: - #collect: requires mapping: (aBlock1 map) - #select: requires filtering: (aBlock2 filter) ## Compose In practice, algorithms often require multiple processing steps, e.g., mapping only a filtered set of elements. Transducers are inherently composable, and hereby, allow to make the combination of steps explicit. Since transducers do not build intermediate collections, their composition is memory-efficient. For example: - (aBlock1 filter) * (aBlock2 map) "(1.) filter and (2.) map elements" ## Re-Use Transducers are decoupled from the input and output sources, and hence, they can be reused in different contexts. For example: - enumeration of collections - processing of streams - communicating via channels # Usage by Example We build a coin flipping experiment and count the occurrence of heads and tails. First, we associate random numbers with the sides of a coin. scale := [:x | (x * 2 + 1) floor] map. sides := #(heads tails) replace. Scale is a transducer that maps numbers x between 0 and 1 to 1 and 2. Sides is a transducer that replaces the numbers with heads an tails by lookup in an array. Next, we choose a number of samples. count := 1000 take. Count is a transducer that takes 1000 elements from a source. We keep track of the occurrences of heads an tails using a bag. collect := [:bag :c | bag add: c; yourself]. Collect is binary block (reducing function) that collects events in a bag. We assemble the experiment by transforming the block using the transducers. experiment := (scale * sides * count) transform: collect. From left to right we see the steps involved: scale, sides, count and collect. Transforming assembles these steps into a binary block (reducing function) we can use to run the experiment. samples := Random new reduce: experiment init: Bag new. Here, we use #reduce:init:, which is mostly similar to #inject:into:. To execute a transformation and a reduction together, we can use #transduce:reduce:init:. samples := Random new transduce: scale * sides * count reduce: collect init: Bag new. We can also express the experiment as data-flow using #<~. This enables us to build objects that can be re-used in other experiments. coin := sides <~ scale <~ Random new. flip := Bag <~ count. Coin is an eduction, i.e., it binds transducers to a source and understands #reduce:init: among others. Flip is a transformed reduction, i.e., it binds transducers to a reducing function and an initial value. By sending #<~, we draw further samples from flipping the coin. samples := flip <~ coin. This yields a new Bag with another 1000 samples. # Basic Concepts ## Reducing Functions A reducing function represents a single step in processing a data sequence. It takes an accumulated result and a value, and returns a new accumulated result. For exa
Re: [Pharo-users] [Deploy] Deploying application - New Best Practices?
Where can i find a current RFBServer? Right now, I don't want to blow away what's currently running as it is an image with data.. will figure out persistence later.. -- View this message in context: http://forum.world.st/Deploy-Deploying-application-New-Best-Practices-tp4948399p4949080.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
Re: [Pharo-users] Pharo and QT
There is a way to make this into a small task One of my experiments of testing my Pharo to Python bridge (What I have named project "Atlas") was to build a QT hello world example. It created a problem because I was using python threads that QT does not like (it offers its own kind of threads) but after changing the code to use no threads, it worked. My bridge is not like UFFI where anything has to be wrapped because unlike C , Python is a dynamic language so there is no need for wrappers because Atlas allows dynamic execution of code. But of course there is the issues of data types and how they can be mapped to Pharo and the fact that PyQT free version is GPL and commercial is 500 dollars which sits of course on top of the commercial version of QT. So at the time I decided to not pursue it. I will give it a try and see how far it can goes, at worst I may offer a partial solution to using QT with Pharo. Then someone else can take it from there if there is genuine interest and expand it to more features. On Fri, Jun 2, 2017 at 12:01 AM Stephane Ducasse wrote: > Hi dimitris > > We would love to have that. We could have a Spec binding and build > automatically applications in QT for people willing. > Esteban always wanted to have a Cocoa binding used the same way. > But this is large task > > Stef > > On Thu, Jun 1, 2017 at 2:44 PM, Hilaire wrote: > >> A must for any serious dekstop application with Pharo, but it is a hudge >> task >> >> >> Le 29/05/2017 à 14:35, Dimitris Chloupis a écrit : >> > Is there an interest for working with QT from Pharo ? I make no >> > promises just something I was interested in trying. >> >> -- >> Dr. Geo >> http://drgeo.eu >> >> >> >> >
Re: [Pharo-users] Porting Transducers to Pharo
If I recall correctly, there is an alternate protocol that looks more like xtreams or the traditional select/collect iterations. On 2 June 2017 at 21:12, Stephane Ducasse wrote: > I have a design question > > why the library is implemented in functional style vs messages? > I do not see why this is needed. To my eyes the compact notation > goes against readibility of code and it feels ad-hoc in Smalltalk. > > > I really prefer > > square := Map function: #squared. > take := Take number: 1000. > > Because I know that I can read it and understand it. > From that perspective I prefer Xtreams. > > Stef > > > > > > > > > > On Wed, May 31, 2017 at 2:23 PM, Steffen Märcker wrote: > >> Hi, >> >> I am the developer of the library 'Transducers' for VisualWorks. It was >> formerly known as 'Reducers', but this name was a poor choice. I'd like to >> port it to Pharo, if there is any interest on your side. I hope to learn >> more about Pharo in this process, since I am mainly a VW guy. And most >> likely, I will come up with a bunch of questions. :-) >> >> Meanwhile, I'll cross-post the introduction from VWnc below. I'd be very >> happy to hear your optinions, questions and I hope we can start a fruitful >> discussion - even if there is not Pharo port yet. >> >> Best, Steffen >> >> >> >> Transducers are building blocks that encapsulate how to process elements >> of a data sequence independently of the underlying input and output >> source. >> >> >> >> # Overview >> >> ## Encapsulate >> Implementations of enumeration methods, such as #collect:, have the logic >> how to process a single element in common. >> However, that logic is reimplemented each and every time. Transducers make >> it explicit and facilitate re-use and coherent behavior. >> For example: >> - #collect: requires mapping: (aBlock1 map) >> - #select: requires filtering: (aBlock2 filter) >> >> >> ## Compose >> In practice, algorithms often require multiple processing steps, e.g., >> mapping only a filtered set of elements. >> Transducers are inherently composable, and hereby, allow to make the >> combination of steps explicit. >> Since transducers do not build intermediate collections, their composition >> is memory-efficient. >> For example: >> - (aBlock1 filter) * (aBlock2 map) "(1.) filter and (2.) map elements" >> >> >> ## Re-Use >> Transducers are decoupled from the input and output sources, and hence, >> they can be reused in different contexts. >> For example: >> - enumeration of collections >> - processing of streams >> - communicating via channels >> >> >> >> # Usage by Example >> >> We build a coin flipping experiment and count the occurrence of heads and >> tails. >> >> First, we associate random numbers with the sides of a coin. >> >> scale := [:x | (x * 2 + 1) floor] map. >> sides := #(heads tails) replace. >> >> Scale is a transducer that maps numbers x between 0 and 1 to 1 and 2. >> Sides is a transducer that replaces the numbers with heads an tails by >> lookup in an array. >> Next, we choose a number of samples. >> >> count := 1000 take. >> >> Count is a transducer that takes 1000 elements from a source. >> We keep track of the occurrences of heads an tails using a bag. >> >> collect := [:bag :c | bag add: c; yourself]. >> >> Collect is binary block (reducing function) that collects events in a bag. >> We assemble the experiment by transforming the block using the >> transducers. >> >> experiment := (scale * sides * count) transform: collect. >> >> From left to right we see the steps involved: scale, sides, count and >> collect. >> Transforming assembles these steps into a binary block (reducing function) >> we can use to run the experiment. >> >> samples := Random new >> reduce: experiment >> init: Bag new. >> >> Here, we use #reduce:init:, which is mostly similar to #inject:into:. >> To execute a transformation and a reduction together, we can use >> #transduce:reduce:init:. >> >> samples := Random new >> transduce: scale * sides * count >> reduce: collect >> init: Bag new. >> >> We can also express the experiment as data-flow using #<~. >> This enables us to build objects that can be re-used in other experiments. >> >> coin := sides <~ scale <~ Random new. >> flip := Bag <~ count. >> >> Coin is an eduction, i.e., it binds transducers to a source and >> understands #reduce:init: among others. >> Flip is a transformed reduction, i.e., it binds transducers to a reducing >> function and an initial value. >> By sending #<~, we draw further samples from flipping the coin. >> >> samples := flip <~ coin. >> >> This yields a new Bag with another 1000 samples. >> >> >> >> # Basic Concepts >> >> ## Reducing Functions >> >> A reducing function represents a single step in processing a data >> sequence. >> It takes an accumulated result and a value, and returns a new accumulated >> result. >> For example: >> >>
Re: [Pharo-users] Porting Transducers to Pharo
I have a design question why the library is implemented in functional style vs messages? I do not see why this is needed. To my eyes the compact notation goes against readibility of code and it feels ad-hoc in Smalltalk. I really prefer square := Map function: #squared. take := Take number: 1000. Because I know that I can read it and understand it. >From that perspective I prefer Xtreams. Stef On Wed, May 31, 2017 at 2:23 PM, Steffen Märcker wrote: > Hi, > > I am the developer of the library 'Transducers' for VisualWorks. It was > formerly known as 'Reducers', but this name was a poor choice. I'd like to > port it to Pharo, if there is any interest on your side. I hope to learn > more about Pharo in this process, since I am mainly a VW guy. And most > likely, I will come up with a bunch of questions. :-) > > Meanwhile, I'll cross-post the introduction from VWnc below. I'd be very > happy to hear your optinions, questions and I hope we can start a fruitful > discussion - even if there is not Pharo port yet. > > Best, Steffen > > > > Transducers are building blocks that encapsulate how to process elements > of a data sequence independently of the underlying input and output source. > > > > # Overview > > ## Encapsulate > Implementations of enumeration methods, such as #collect:, have the logic > how to process a single element in common. > However, that logic is reimplemented each and every time. Transducers make > it explicit and facilitate re-use and coherent behavior. > For example: > - #collect: requires mapping: (aBlock1 map) > - #select: requires filtering: (aBlock2 filter) > > > ## Compose > In practice, algorithms often require multiple processing steps, e.g., > mapping only a filtered set of elements. > Transducers are inherently composable, and hereby, allow to make the > combination of steps explicit. > Since transducers do not build intermediate collections, their composition > is memory-efficient. > For example: > - (aBlock1 filter) * (aBlock2 map) "(1.) filter and (2.) map elements" > > > ## Re-Use > Transducers are decoupled from the input and output sources, and hence, > they can be reused in different contexts. > For example: > - enumeration of collections > - processing of streams > - communicating via channels > > > > # Usage by Example > > We build a coin flipping experiment and count the occurrence of heads and > tails. > > First, we associate random numbers with the sides of a coin. > > scale := [:x | (x * 2 + 1) floor] map. > sides := #(heads tails) replace. > > Scale is a transducer that maps numbers x between 0 and 1 to 1 and 2. > Sides is a transducer that replaces the numbers with heads an tails by > lookup in an array. > Next, we choose a number of samples. > > count := 1000 take. > > Count is a transducer that takes 1000 elements from a source. > We keep track of the occurrences of heads an tails using a bag. > > collect := [:bag :c | bag add: c; yourself]. > > Collect is binary block (reducing function) that collects events in a bag. > We assemble the experiment by transforming the block using the transducers. > > experiment := (scale * sides * count) transform: collect. > > From left to right we see the steps involved: scale, sides, count and > collect. > Transforming assembles these steps into a binary block (reducing function) > we can use to run the experiment. > > samples := Random new > reduce: experiment > init: Bag new. > > Here, we use #reduce:init:, which is mostly similar to #inject:into:. > To execute a transformation and a reduction together, we can use > #transduce:reduce:init:. > > samples := Random new > transduce: scale * sides * count > reduce: collect > init: Bag new. > > We can also express the experiment as data-flow using #<~. > This enables us to build objects that can be re-used in other experiments. > > coin := sides <~ scale <~ Random new. > flip := Bag <~ count. > > Coin is an eduction, i.e., it binds transducers to a source and > understands #reduce:init: among others. > Flip is a transformed reduction, i.e., it binds transducers to a reducing > function and an initial value. > By sending #<~, we draw further samples from flipping the coin. > > samples := flip <~ coin. > > This yields a new Bag with another 1000 samples. > > > > # Basic Concepts > > ## Reducing Functions > > A reducing function represents a single step in processing a data sequence. > It takes an accumulated result and a value, and returns a new accumulated > result. > For example: > > collect := [:col :e | col add: e; yourself]. > sum := #+. > > A reducing function can also be ternary, i.e., it takes an accumulated > result, a key and a value. > For example: > > collect := [:dic :k :v | dict at: k put: v; yourself]. > > Reducing functions may be equipped with an optional completing action. > After finishing processing, it i
Re: [Pharo-users] Porting Transducers to Pharo
Hi steffen This is a great news. We need cool frameworks. - There is a package on cincom store to support the migration from VW to Pharo. FileOuter something. The name escapes my mind now. We updated it last year to help porting one application to Pharo. - I can help producing a nice document :) On Wed, May 31, 2017 at 2:23 PM, Steffen Märcker wrote: > Hi, > > I am the developer of the library 'Transducers' for VisualWorks. It was > formerly known as 'Reducers', but this name was a poor choice. I'd like to > port it to Pharo, if there is any interest on your side. I hope to learn > more about Pharo in this process, since I am mainly a VW guy. And most > likely, I will come up with a bunch of questions. :-) > > Meanwhile, I'll cross-post the introduction from VWnc below. I'd be very > happy to hear your optinions, questions and I hope we can start a fruitful > discussion - even if there is not Pharo port yet. > > Best, Steffen > > > > Transducers are building blocks that encapsulate how to process elements > of a data sequence independently of the underlying input and output source. > > > > # Overview > > ## Encapsulate > Implementations of enumeration methods, such as #collect:, have the logic > how to process a single element in common. > However, that logic is reimplemented each and every time. Transducers make > it explicit and facilitate re-use and coherent behavior. > For example: > - #collect: requires mapping: (aBlock1 map) > - #select: requires filtering: (aBlock2 filter) > > > ## Compose > In practice, algorithms often require multiple processing steps, e.g., > mapping only a filtered set of elements. > Transducers are inherently composable, and hereby, allow to make the > combination of steps explicit. > Since transducers do not build intermediate collections, their composition > is memory-efficient. > For example: > - (aBlock1 filter) * (aBlock2 map) "(1.) filter and (2.) map elements" > > > ## Re-Use > Transducers are decoupled from the input and output sources, and hence, > they can be reused in different contexts. > For example: > - enumeration of collections > - processing of streams > - communicating via channels > > > > # Usage by Example > > We build a coin flipping experiment and count the occurrence of heads and > tails. > > First, we associate random numbers with the sides of a coin. > > scale := [:x | (x * 2 + 1) floor] map. > sides := #(heads tails) replace. > > Scale is a transducer that maps numbers x between 0 and 1 to 1 and 2. > Sides is a transducer that replaces the numbers with heads an tails by > lookup in an array. > Next, we choose a number of samples. > > count := 1000 take. > > Count is a transducer that takes 1000 elements from a source. > We keep track of the occurrences of heads an tails using a bag. > > collect := [:bag :c | bag add: c; yourself]. > > Collect is binary block (reducing function) that collects events in a bag. > We assemble the experiment by transforming the block using the transducers. > > experiment := (scale * sides * count) transform: collect. > > From left to right we see the steps involved: scale, sides, count and > collect. > Transforming assembles these steps into a binary block (reducing function) > we can use to run the experiment. > > samples := Random new > reduce: experiment > init: Bag new. > > Here, we use #reduce:init:, which is mostly similar to #inject:into:. > To execute a transformation and a reduction together, we can use > #transduce:reduce:init:. > > samples := Random new > transduce: scale * sides * count > reduce: collect > init: Bag new. > > We can also express the experiment as data-flow using #<~. > This enables us to build objects that can be re-used in other experiments. > > coin := sides <~ scale <~ Random new. > flip := Bag <~ count. > > Coin is an eduction, i.e., it binds transducers to a source and > understands #reduce:init: among others. > Flip is a transformed reduction, i.e., it binds transducers to a reducing > function and an initial value. > By sending #<~, we draw further samples from flipping the coin. > > samples := flip <~ coin. > > This yields a new Bag with another 1000 samples. > > > > # Basic Concepts > > ## Reducing Functions > > A reducing function represents a single step in processing a data sequence. > It takes an accumulated result and a value, and returns a new accumulated > result. > For example: > > collect := [:col :e | col add: e; yourself]. > sum := #+. > > A reducing function can also be ternary, i.e., it takes an accumulated > result, a key and a value. > For example: > > collect := [:dic :k :v | dict at: k put: v; yourself]. > > Reducing functions may be equipped with an optional completing action. > After finishing processing, it is invoked exactly once, e.g., to free > resources. > > stream := [:str :e | str nextPut: each; yourself] comp
Re: [Pharo-users] Porting Transducers to Pharo
To get the extension methods into the Transducers package, the following worked for me - edit the category to have the prefix '*Transducers-' 2710c2710 < !Number methodsFor: 'transforming' stamp: ' 2/6/17 15:38'! --- > !Number methodsFor: '*Transducers-transforming' stamp: ' 2/6/17 15:38'! On Fri, Jun 2, 2017 at 11:05 AM, Steffen Märcker wrote: > Dear all, > > thanks for the many suggestions. I didn't had time to test all > import/export ways yet. But for now, I can report on two: > > 1) NGFileOuter > Unfortunately It raised several MNUs in my image. I'll investigate them > later. > > 2) FileOut30 (VW Contributed) > I was able to file out the code except for the package definition. > Replacing {category: ''} in the class definitions with {package: > 'Transducers'} fixed that. However, methods that extend existing classes > did not end up in the Transducers package. Is there a similar easy change > to the file-out making that happen? Also I'd like to add the package > comment if that's possible. > > Most things appear to work as far as I can see. Two exceptions: > 1) Random is a subclass of Stream in VW and in Pharo it is not. Hence, > I'll have to copy some methods from Stream to Random. > 2) I used #beImmutable in VW but I couldn't yet figure out how to make > objects immutable in Pharo. > > However, until the tests are ported, I cannot guarantee. Porting the test > suite will be another beast, since I rely on the excellent mocking/stubbing > library DoubleAgents by Randy Coulman. I am not sure how I will handle > that. In general, I think it would be really worth the effort to be ported > to Pharo, too. DoubleAgents is pretty powerful and produces easy to read > and understand mocking/stubbing code. Personally, I prefer it clearly, > e.g., over Mocketry (no offence intended!). > > Attached you'll find the file-out that I loaded into Pharo. The issues > above are not addressed yet. However, the following example works: > > | scale sides count collect experiment random samples coin flip | > scale := [:x | (x * 2 + 1) floor] map. > sides := #(heads tails) replace. > count := 1000 take. > collect := [:bag :c | bag add: c; yourself]. > experiment := (scale * sides * count) transform: collect. > random := #(0.1 0.3 0.4 0.5 0.6 0.7 0.8 0.9). > > samples := random > reduce: experiment > init: Bag new. > > samples := random > transduce: scale * sides * count > reduce: collect > init: Bag new. > > coin := sides <~ scale <~ random. > flip := Bag <~ count. > > samples := flip <~ coin. > > > Best, Steffen > > > > Am .06.2017, 08:16 Uhr, schrieb Stephane Ducasse >: > > There is a package for that NGFileOuter or something like that on cincom >> store. >> We used it for mobydic code. >> >> On Wed, May 31, 2017 at 6:35 PM, Alexandre Bergel < >> alexandre.ber...@me.com> >> wrote: >> >> If I remember correctly, there is a parcel in VisualWorks to export a file >>> out (Squeak format). >>> >>> @Milton, can you give a hand to Steffen? >>> >>> Alexandre >>> -- >>> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: >>> Alexandre Bergel http://www.bergel.eu >>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. >>> >>> >>> >>> On May 31, 2017, at 10:32 AM, Steffen Märcker wrote: >>> >>> Thanks for the encouraging response! First question: Which is the >>> recommended (friction free) way to exchange code between VW and Pharo? >>> >>> Cheers! >>> Steffen >>> >>> Am .05.2017, 16:22 Uhr, schrieb Alexandre Bergel < >>> alexandre.ber...@me.com >>> >: >>> >>> I second Sven. This is very exciting! >>> >>> Let us know when you have something ready to be tested. >>> >>> Alexandre >>> >>> >>> >>> >>>
Re: [Pharo-users] Can we auto translate Python to Smalltalk?
Hello, Actually I did the opposite to be able to use Python 3 libraries from Pharo. It is not complete, but you may want to take a look at it [1]. Using this lib you can craft a Python 3 AST and generate its source code. I guess there is a way to access the AST of a Python program using the API. Now, you have to see if it is always possible to convert a Python AST to a Pharo AST. One day, I read about someone that converted Python to Ruby (or the opposite) using bytecode translation. Maybe it is another way to do it. Julien Links: [1]: https://github.com/juliendelplanque/Python3Generator On 02/06/17 17:20, askoh wrote: Python and JavaScript are driving the movement to Dynamic Languages. In particular, Python is the language of choice to teach students programming in universities. So, Smalltalk stands to gain from this shift. We all know that Smalltalk has the best environment. But we lack the diverse code base. Can we patch that gap with automatic translation from Python to Smalltalk? How feasible would it be to auto translate SciPy to SciSmalltalk? Even if it is imperfect, can we cut the effort by 50% or 80%? All the best, Aik-Siong Koh -- View this message in context: http://forum.world.st/Can-we-auto-translate-Python-to-Smalltalk-tp4949015.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
[Pharo-users] Can we auto translate Python to Smalltalk?
Python and JavaScript are driving the movement to Dynamic Languages. In particular, Python is the language of choice to teach students programming in universities. So, Smalltalk stands to gain from this shift. We all know that Smalltalk has the best environment. But we lack the diverse code base. Can we patch that gap with automatic translation from Python to Smalltalk? How feasible would it be to auto translate SciPy to SciSmalltalk? Even if it is imperfect, can we cut the effort by 50% or 80%? All the best, Aik-Siong Koh -- View this message in context: http://forum.world.st/Can-we-auto-translate-Python-to-Smalltalk-tp4949015.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
Re: [Pharo-users] Porting Transducers to Pharo
Dear all, thanks for the many suggestions. I didn't had time to test all import/export ways yet. But for now, I can report on two: 1) NGFileOuter Unfortunately It raised several MNUs in my image. I'll investigate them later. 2) FileOut30 (VW Contributed) I was able to file out the code except for the package definition. Replacing {category: ''} in the class definitions with {package: 'Transducers'} fixed that. However, methods that extend existing classes did not end up in the Transducers package. Is there a similar easy change to the file-out making that happen? Also I'd like to add the package comment if that's possible. Most things appear to work as far as I can see. Two exceptions: 1) Random is a subclass of Stream in VW and in Pharo it is not. Hence, I'll have to copy some methods from Stream to Random. 2) I used #beImmutable in VW but I couldn't yet figure out how to make objects immutable in Pharo. However, until the tests are ported, I cannot guarantee. Porting the test suite will be another beast, since I rely on the excellent mocking/stubbing library DoubleAgents by Randy Coulman. I am not sure how I will handle that. In general, I think it would be really worth the effort to be ported to Pharo, too. DoubleAgents is pretty powerful and produces easy to read and understand mocking/stubbing code. Personally, I prefer it clearly, e.g., over Mocketry (no offence intended!). Attached you'll find the file-out that I loaded into Pharo. The issues above are not addressed yet. However, the following example works: | scale sides count collect experiment random samples coin flip | scale := [:x | (x * 2 + 1) floor] map. sides := #(heads tails) replace. count := 1000 take. collect := [:bag :c | bag add: c; yourself]. experiment := (scale * sides * count) transform: collect. random := #(0.1 0.3 0.4 0.5 0.6 0.7 0.8 0.9). samples := random reduce: experiment init: Bag new. samples := random transduce: scale * sides * count reduce: collect init: Bag new. coin := sides <~ scale <~ random. flip := Bag <~ count. samples := flip <~ coin. Best, Steffen Am .06.2017, 08:16 Uhr, schrieb Stephane Ducasse : There is a package for that NGFileOuter or something like that on cincom store. We used it for mobydic code. On Wed, May 31, 2017 at 6:35 PM, Alexandre Bergel wrote: If I remember correctly, there is a parcel in VisualWorks to export a file out (Squeak format). @Milton, can you give a hand to Steffen? Alexandre -- _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel http://www.bergel.eu ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. On May 31, 2017, at 10:32 AM, Steffen Märcker wrote: Thanks for the encouraging response! First question: Which is the recommended (friction free) way to exchange code between VW and Pharo? Cheers! Steffen Am .05.2017, 16:22 Uhr, schrieb Alexandre Bergel >: I second Sven. This is very exciting! Let us know when you have something ready to be tested. Alexandre transducers.pharo.st Description: Binary data
Re: [Pharo-users] Morphic or forking bug?
Hi Horrido, It is very hard to follow what you are exactly doing or trying to do. Here is the simplest example I can think of that updates something in Morphic on a regular basis. StringMorph subclass: #MyClock instanceVariableNames: '' classVariableNames: '' package: '_UnpackagedPackage' MyClock>>#initialize super initialize. self updateClock MyClock>>#step self updateClock MyClock>>#updateClock self contents: Time now printString MyClock class>>#open "self open" ^ self new openInWindow This inherits #stepTime as 1 second. If I open such a window and save my image, it is still there when the image is restarted, with the clock still working. Updating (data structures in) the main UI process from another process is dangerous. Saving such constructs is even more dangerous. HTH, Sven > On 2 Jun 2017, at 15:54, horrido wrote: > > Sorry, I could be mistaken. I just checked my notes. The *0 asString* test > failed once, but I've not been able to replicate it. I might've been working > with an unclean image. > > So perhaps it is related to Morphic, after all. > > > horrido wrote >> Yup, they all fail. Interesting that > * >> 0 asString > * >> fails. This means it has NOTHING to do with Morphic (or Morphic being >> thread-unsafe). >> >> Ben Coman wrote >>> On Wed, May 31, 2017 at 10:23 PM, horrido < > >>> horrido.hobbies@ > >>> > wrote: >>> >>> Can you try a few other variations... >>> [ [ true ] whileTrue: [ 0 asString. delay wait ] fork. >>> [ [ true ] whileTrue: [ a contents: '0'. delay wait ] fork. >>> [ [ true ] whileTrue: [ a contents: '0'. ] forkAt: 20. >>> >>> cheers -ben > > > > > > -- > View this message in context: > http://forum.world.st/Morphic-or-forking-bug-tp4948727p4948984.html > Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
Re: [Pharo-users] Morphic or forking bug?
Sorry, I could be mistaken. I just checked my notes. The *0 asString* test failed once, but I've not been able to replicate it. I might've been working with an unclean image. So perhaps it is related to Morphic, after all. horrido wrote > Yup, they all fail. Interesting that * > 0 asString * > fails. This means it has NOTHING to do with Morphic (or Morphic being > thread-unsafe). > > Ben Coman wrote >> On Wed, May 31, 2017 at 10:23 PM, horrido < >> horrido.hobbies@ >> > wrote: >> >> Can you try a few other variations... >>[ [ true ] whileTrue: [ 0 asString. delay wait ] fork. >>[ [ true ] whileTrue: [ a contents: '0'. delay wait ] fork. >>[ [ true ] whileTrue: [ a contents: '0'. ] forkAt: 20. >> >> cheers -ben -- View this message in context: http://forum.world.st/Morphic-or-forking-bug-tp4948727p4948984.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
Re: [Pharo-users] Morphic or forking bug?
Yup, they all fail. Interesting that *0 asString* fails. This means it has NOTHING to do with Morphic (or Morphic being thread-unsafe). Ben Coman wrote > On Wed, May 31, 2017 at 10:23 PM, horrido < > horrido.hobbies@ > > wrote: > > Can you try a few other variations... >[ [ true ] whileTrue: [ 0 asString. delay wait ] fork. >[ [ true ] whileTrue: [ a contents: '0'. delay wait ] fork. >[ [ true ] whileTrue: [ a contents: '0'. ] forkAt: 20. > > cheers -ben -- View this message in context: http://forum.world.st/Morphic-or-forking-bug-tp4948727p4948983.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.