Pharo-users
By thread
pharo-users@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
November 2017
- 87 participants
- 872 messages
Re: [Pharo-users] Why does the test runner show red when I correct a test?
by Richard Sargent
>> I would expect it to turn green if I press resume.
I disagree with your expectations. You are arguing that we should operate is
if "probably correct" is the same as "correct". That's why we have ****ty
software.
I have no objection to leaving the method uncoloured when you resume after
correcting the error.
I have no objection to eliminating the red colouring in these scenarios.
I strongly object to pretending that it is known to be correct.
In my experience, we end up with better results when we act on what we
absolutely know to be factual and stop relying on guessing.
_____
From: Pharo-users [mailto:pharo-users-bounces@lists.pharo.org] On Behalf Of
Tim Mackinnon
Sent: November 14, 2017 06:19
To: Any question about pharo is welcome
Subject: Re: [Pharo-users] Why does the test runner show red when I correct
a test?
Richard - I better understand what you are saying now. If you change the
method and save it (hence restarting on the stack) I would expect it to turn
green if I press resume. That is the TDD flow I expect, and one which sunit
and coding in the debugger was predicated on.
However, there is the potential that some memory object that cached a result
and is now running a second time could be the cause of a pass and so it is
remotely possible that this is a false pass.. (And this I think is the crux
of your argument - if any memory object is affected, theoretically you
should rerun the whole transaction from a virgin state - which is
effectively rerun the test from the beginning). So I guess we are discussing
that we don't have fully transactional memory executions?
However I would argue that its way more common that you edit a method and
fix a text and have 0 side effects than mucking around in memory or having
something that rerunning locally messes up memory as well. So its much more
useful to get the confirmation of green and move on. YES you could have a
subtle error, and when you re-run it may later go red - but I would favour
the 99% case as its a annoying if you are doing TDD.
Tim
On 10 Nov 2017, at 19:45, Richard Sargent
<richard.sargent(a)gemtalksystems.com> wrote:
I hear you and I understand your pain.
However, if you corrected the problem, not by a code change, but by playing
in the object's inspector or otherwise causing its internal state to change,
and then resumed from the debugger, would you still claim the method was
successful and should be coloured green?
The only thing we can claim is that there were or were not further errors in
the test. Colour it red if there were, but you cannot honestly colour it
green. The code doesn't actually work.
On Fri, Nov 10, 2017 at 11:29 AM, Tim Mackinnon <tim(a)testit.works> wrote:
My specific usecase is from a pragmatic TDD perspective - failing test, in
the debugger you fix the test and press proceed - expecting green. Getting
red, and then immediately running again to get red takes away from our story
of love coding and loving your debugger - and even Cassie me to mistrust the
tools.
I get the idea that you can jiffy in the debugger and cause a false pass -
but I feel you are penalised for doing it right at the moment.
Of course these tests will get run again, but I like the idea that if I did
it right, it should recognise this, not incur an extra click and moment of
doubt.
A button to rerun the whole lot, or automatically rerun, or just run it
would work for me.
Tim
Sent from my iPhone
On 10 Nov 2017, at 17:56, Richard Sargent <richard.sargent@
<mailto:richard.sargent@gemtalksystems.com> gemtalksystems.com> wrote:
That would be fine.
The point is that, without running the test in its entirety, from start to
finish, without interruption, error, or failure, one cannot claim success.
On Fri, Nov 10, 2017 at 9:34 AM, Sean P. DeNigris <sean(a)clipperadams.com>
wrote:
Richard Sargent wrote
> The only reliable conclusion one can make from such an interrupted run is
> whether it failed again. So, it would be possible to determine that the
> test should be coloured red, but it is impossible to *reliably* claim that
> the test should be coloured green.
What if we ran the test again as if from the browser/runner before setting
the icon?
-----
Cheers,
Sean
--
Sent from: http://forum.world.st/Pharo-Sm
<http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html>
alltalk-Users-f1310670.html
Nov. 14, 2017
FFI 64 bit libClang issue on Sierra.
by Todd Blanchard
I've got it loaded, have fixed up the library path and fixed the test for version (built in lib returns very different version string).
I have many tests green. However, as before, tests involving CXSourceRange that return CXSourceLocations return all zero'd data. The CXSourceRange struct looks sane.
The calls to CXSourceLocation clang_getRangeStart(CXSourceRange range);
and its twin RangeEnd result in zero'd structs.
Any idea on where I can look to try to figure out where this is going wrong?
I have compiled little C programs and verified that both struct sizes agree in FFI and native code (24 bytes each).
Not sure what to try next.
-Todd Blanchard
Nov. 14, 2017
Re: [Pharo-users] Stream API
by Denis Kudriashov
2017-11-14 16:30 GMT+01:00 Steffen Märcker <merkste(a)web.de>:
> I forgot to mention, that the most recent code for Pharo is already on
> Github: https://github.com/Pharophile/Transducers
>
> Reducers was the name of the first very first implementation.
>
> (In fact, I was originally inspired by clojures Reducers lib. After
> implementing it in Smalltalk, I developed the concept further. Later I
> found out, that the clojure guys did the same in parallel and ended up with
> the same abstraction but a differnt name. Hence I decided change the name
> in order to make the relation clear.)
I like abstraction. But I think names and order of computation should be
changed to be more Smalltalk friendly. Because now it looks like Haskell
with right to left order:
squares := Set <~ 1000 take <~ #squared map <~ (1 to: 1000).
fileOut writeStream <~ #isSeparator filter <~ fileIn readStream.
Is there any reason to not change it? I would like to start expressions
with source of data:
squares := (1 to: 1000) ~> #squared map ~> 1000 take ~> Set.
fileIn readStream ~> #isSeparator filter ~> fileOut writeStream.
> Am .11.2017, 16:18 Uhr, schrieb Sven Van Caekenberghe <sven(a)stfx.eu>:
>
>
>>
>> On 14 Nov 2017, at 16:00, Steffen Märcker <merkste(a)web.de> wrote:
>>>
>>> Hi,
>>>
>>> <---Schnitt--->
>
>>
>>> No. Transducers is my side project. I've implemented a package for
>>> VisualWorks. Unfortunately, I did not finish the port to Pharo yet, simply
>>> due to a lack of time. Originally, transducers evolved in the clojure
>>> community. I figured, the concept a good fit for Smalltalk and adapted it
>>> accordingly. (My thesis is on conditional probabilities in model-checking
>>> of probabilistic systems.)
>>>
>>> <---Schnitt--->
>
>
>>> http://www.cincomsmalltalk.com/publicRepository/Transducers.html
>>> https://clojure.org/reference/transducers
>>> Plus some mails on this list and more on the vwnc list. Feel free to
>>> ask; I understand, that the package comment has lots of potential for
>>> improvement to help understanding.
>>>
>>> Best, Steffen
>>>
>>
>> Some code seems to be here: http://smalltalkhub.com/#!/~cdlm/Experiments
>>
>> Not sure if it is complete or what the relation is, or the difference
>> between transducers and reducers ...
>>
>>
>>
>
>
>
Nov. 14, 2017
Re: [Pharo-users] About implementing a "Mini Pillar" in-image renderer for Pharo ...
by Offray Vladimir Luna Cárdenas
I have been just trying to install GT Documenter and is really
frustrating (I have been unable to install it even for the first time!).
This was the list of errors I got and steps I followed, in almost
sequential order, just to get a (bittersweet!) taste of GT Documenter:
* 1st: LGit_GIT_ERROR: No ssh-agent suitable credentials found. So I
go to GitHub, follow the five pages of documentation to get my SSH
credentials that start at [1], then, because I still get the same
error, go to the Iceberg FAQ [2], try to surpass the erro,r via
command line and doesn't work, so I go to the Iceberg settings and
try the manual configuration, going to the next item
[1]
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-…
[2] https://github.com/pharo-vcs/iceberg/blob/master/README.md
* Now I get "Instance of LGitCredentialsSSH class did not understand
#ifTrue:ifFalse:". I try to make sense of it in the debugger, but is
something I cannot. Anyway, I rerun it and now I get:
LGit_GIT_EEXISTS:
'/home/offray/Programas/Pharo/6.1a/Dev24/pharo-local/iceberg/feenkcom/gtoolkit'
exists and is not an empty directory. I delete that directory and
try an installation... again
* Now I get: "Instance of FileReference did not understand #notEmpty".
I try to make sense of it in the debugger. My user is git, my public
and private ssh keys are not empty. Despite of not making sense of
all I understand that is trying to clone something at
git@github.com:feenkcom/gtoolkit.git. I go to my image dir and then
to `iceberg/feenkcom/gtoolkit/`. There is a git repository there,
but is empty.
* Now I wonder, maybe if I can just clone the directory there, but how
I say Iceberg to load it? So I run now only the Metacello part. Same
error and solution that the last time but now for
gtoolkit-visualizer, Brick, gtoolkit-examples, Bloc and Sparta.
* After getting my ssh keys, overcome config problems in shell and the
Pharo settings, chasing these errors and solving them by cloning the
repositories manually, I'm, a couple of hours later, ready to test
GT Documenter, but with the last Iceberg's duplicated repository
message about Sparta I give up. Is not nice to start your day
accumulating frustration... that sets a bad mood for the rest of it,
and you need to actively fight against.
I have thought that Git is overcomplicated for most of the developers'
tasks and communities. I don't know if the root of previous issues is in
the "Iceberg enableMetacelloIntegration: true" line, but having to get
your pair of keys working to just install software is overkill for the
common user (and when LibGit errors are present, the documented
solutions don't work seamlessly). Maybe a more sensitive solution would
be just to use libgit, without any ssh auth to clone repositories and
its prerequisites or even better, some download that goes to the files
in the tip (or other) version without all this overhead.
Anyway, as I said, I have been unable to test GT Documenter properly and
getting feedback over GT Tools from the team usually requires a lot of
effort in my case (insisting on getting answers or getting none). And
that is just to test a promising tech that still doesn't offer saving
features (just and awesome preview). I think that a more sensible
approach for a good documentation toolkit for now is on Spec and
creating custom syntax highlighters with SmaCC[3], that is well
documented and works today.
[3]
https://medium.com/@juliendelplanque/hacking-a-simple-syntactic-highlighter…
I understand that community is trying its best, but expressing how
current offerings are not mature and constructive criticism can help on
that. At the moment my feeling is that if you want to try the new shinny
alpha stuff from GT Documenter, you will need to be prepared for a lot
of frustration and silence.
Cheers,
Offray
On 10/11/17 12:41, Tudor Girba wrote:
> Hi,
>
> As shown at ESUG, GT Documenter offers an advanced viewer (and editor) for Pillar working on top of Bloc.
>
> You can get it by loading:
>
> Iceberg enableMetacelloIntegration: true.
> Metacello new
> baseline: 'GToolkit';
> repository: 'github://feenkcom/gtoolkit/src';
> load.
>
> For example, you can then inspect:
> 'PATH_TO_ICEBERG/feenkcom/gtoolkit/doc/transcript/index.pillarâ asFileReference
>
> Cheers,
> Doru
>
>
>> On Nov 10, 2017, at 12:58 PM, H. Hirzel <hannes.hirzel(a)gmail.com> wrote:
>>
>> A note:
>>
>> Tudor Girba wrote:
>> <tudor(a)tudorgirba.com> Fri, Aug 25, 2017 at 1:31 PM
>> Reply-To: Any question about pharo is welcome <pharo-users(a)lists.pharo.org>
>> To: Any question about pharo is welcome <pharo-users(a)lists.pharo.org>
>>
>> Hi,
>>
>> As mentioned in an announcement about 10 days ago, we are building a
>> Pillar editor with inline viewing abilities in Bloc. Here is how it
>> looked like. Please note the embedded picture. We continued working on
>> it since then and we will probably announce the next version this
>> weekend:
>>
>>
>> Maybe there is now enough progress to do simple presentations in Bloc?
>>
>>
>> On 11/10/17, H. Hirzel <hannes.hirzel(a)gmail.com> wrote:
>>> Hello
>>>
>>> In the thread 'including Pillar in Pharo image by default' it was
>>> suggested by Stephane Ducasse to include a subset of Pillar in the
>>> Pharo image[1] .
>>>
>>> I'd like to extend that proposal a little bit it in order to do very
>>> simple presentations. This should allow to describe at least part of
>>> the slides used in the MOOC course [3].
>>>
>>> This will be _a possible_ solution to the question brought up in the
>>> thread 'Writing "powerpoint" like presentations in Pharo?'.
>>>
>>> Another use is to write instructions with executable content within
>>> the image ("Assistants").
>>>
>>> So below is the a proposal for a Pillar syntax _subset_ for class
>>> comments and _simple_ presentations.
>>> The numbering scheme follows the 'Pillar syntax cheat sheet' [2]
>>>
>>>
>>>
>>>
>>> MINI PILLAR SYNTAX (a subset of Pillar)
>>>
>>> 1. Headers
>>>
>>> !Header 1
>>> !!Header 2
>>> !!!Header 3
>>>
>>>
>>> 2. Lists
>>>
>>> - Unordered List
>>> # Ordered list
>>>
>>>
>>>
>>> 5. Emphasis
>>>
>>> ""bold""
>>>
>>>
>>> 6. Code blocks
>>>
>>> [[[
>>> Transcript show: 'Hello World'.
>>> \]]]
>>>
>>>
>>> 9. Annotation
>>>
>>> ${slide:title=About Pharo}$
>>>
>>>
>>>
>>>
>>> Next week I plan to implement the rendering of this 'Mini Pillar' in
>>> Morphic using the Morphic API subset that works in Pharo and Squeak.
>>>
>>> A renderer using Bloc would also be nice. [4]
>>>
>>> Comments, suggestions, code snippets and other help is welcome.
>>>
>>> Regards
>>> Hannes
>>>
>>>
>>>
>>>
>>> --------------------------------------------------------------------------------------------------
>>> [1] Pillar subset for class comments
>>>
>>> Stephane Ducasse
>>> <stepharo.self(a)gmail.com> Fri, Aug 11, 2017 at 7:09 PM
>>> To: Any question about pharo is welcome <pharo-users(a)lists.pharo.org>
>>>
>>> Tx cyril
>>>
>>> For class comment I image that we want
>>>
>>> !
>>>
>>> -
>>> -
>>> *url*
>>> and bold
>>> [[[
>>>
>>> ]]]
>>>
>>> Did I miss something.
>>>
>>> Stef
>>>
>>>
>>>
>>>
>>>
>>> --------------------------------------------------------------------------------------------------
>>> [2]
>>> http://pillarhub.pharocloud.com/hub/pillarhub/pillarcheatsheet
>>> --------------------------------------------------------------------------------------------------
>>>
>>>
>>> 1. Headers
>>>
>>> !Header 1
>>> !!Header 2
>>> !!!Header 3
>>> !!!!Header 4
>>> !!!!!Header 5
>>> !!!!!!Header 6
>>>
>>> 2. Lists
>>>
>>> - Unordered List
>>> # Ordered list
>>>
>>> 3. Table
>>>
>>> |! Left |! Right |! Centered
>>> |{Left |}Right| Centered
>>>
>>>
>>> 4. Description
>>> Note
>>> on a new line
>>>
>>> ;head
>>> :item
>>>
>>>
>>> 5. Emphasis
>>>
>>> ""bold""
>>> ''italic''
>>> --strikethrough--
>>> __underscore__
>>> ==inline code==
>>> @@subscript@@
>>> ^^sub-script^^
>>>
>>> 6. Code blocks
>>>
>>> [[[labÂel=ÂhelÂloSÂcriÂpt|ÂcapÂtioÂn=How to print Hello
>>> World|ÂlanÂguaÂge=ÂSmaÂlltalk
>>> Transcript show: 'Hello World'.
>>> \]]]
>>>
>>>
>>> 7. Raw
>>>
>>>
>>> {{{latex:
>>> this is how you inject raw \LaTeX in your output file
>>> }}}
>>>
>>> {{{marÂkdown:
>>> this is how you inject raw `markdown` in your output file
>>> }}}
>>>
>>> {{{html:
>>> this is how you inject raw <b>ÂhtmÂl</Âb> in your output file
>>> }}}
>>>
>>>
>>> 8. Links
>>>
>>> Anchor @anchor (new line)
>>> Internal link *anchor*
>>> External link *Google>http://google.com*
>>> Image +Caption>file://image.png|width=50|label=label+
>>>
>>>
>>> 9. Annotation
>>> Note
>>> on a new line
>>>
>>> Annotation @@note this is a note
>>> Todo item @@todo this is to do
>>>
>>>
>>> 10. Comments
>>>
>>> % each line starting with % is commented
>>>
>>>
>>> 11. References
>>>
>>> This document is copied from
>>> http://www.cheatography.com/benjaminvanryseghem/cheat-sheets/pillar/
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> ----------------------------------------------------------------------
>>> [3] Example pillar code for slides
>>> ----------------------------------------------------------------------
>>>
>>> https://github.com/SquareBracketAssociates/PharoMooc/blob/master/Slides/1-T…
>>>
>>> {
>>> "title":"To the Roots of Objects",
>>> "subtitle":"Learning from beauty",
>>> "author":"Stephane Ducasse",
>>> "complement":"http://stephane.ducasse.free.fr/ \\\\
>>> stephane.ducasse(a)inria.fr"
>>> }
>>>
>>>
>>> ${toc:depthLevel=2|level=0|highlight=0}$
>>>
>>> %Les sections ne sont pas des titres de slide mais définnissent la
>>> structure du doucment. Il est possible de rajouter
>>> "renderStructureAsSlide":false dans pillar.conf pour ne pas créer de
>>> slide à partir d'un titre.
>>>
>>>
>>> ${slide:title=License}$
>>>
>>> +>file://figures/CreativeCommons.png|width=50|label=figCreativeCommons+
>>>
>>>
>>> ! Introduction
>>>
>>> %
>>> ${toc:depthLevel=1|level=0|highlight=1}$
>>>
>>>
>>> ${slide:title=Really?!|label=really}$
>>>
>>> ${columns}$
>>>
>>> ${column:width=50}$
>>>
>>> %the width parameter take an Int between 1 and 100
>>> %For now we have to pass a line before and after an annotation, I'll
>>> correct that soon in Pillar.
>>> - No primitive types
>>> - No hardcoded constructs for conditional
>>> - Only messages
>>> - Only objects
>>>
>>> ${column:width=50}$
>>>
>>> - and this works?
>>> - I mean really?
>>> - Not even slow?
>>> - Can't be real!
>>>
>>> ${endColumns}$
>>>
>>> ${slide:title=Motto}$
>>>
>>> - Let's open our eyes, look, understand, and deeply understand the
>>> underlying design aspects of object-oriented programming.
>>>
>>>
>>> *@really*
>>>
>>> *TEST !>@really*
>>>
>>> ${slide:title=Booleans}$
>>>
>>> [[[language=smalltalk
>>> 3 > 0
>>> ifTrue: ['positive']
>>> ifFalse: ['negative']
>>> -> 'positive'
>>> ]]]
>>>
>>> ${slide:title=Yes ifTrue\:ifFalse\: is a message!}$
>>>
>>> [[[language=smalltalk
>>> Weather isRaining
>>> ifTrue: [self takeMyUmbrella]
>>> ifFalse: [self takeMySunglasses]
>>> ]]]
>>>
>>> - Conceptually ==ifTrue:ifFalse:== is a message sent to an object: a
>>> boolean!
>>> - ==ifTrue:ifFalse:== is in fact radically optimized by the compiler
>>> but you can implement another one such ==siAlors:sinon:== and check.
>>>
>>> ${slide:title=Booleans}$
>>>
>>> In Pharo booleans have nothing special
>>> - & | not
>>> - or: and: (lazy)
>>> - xor:
>>> - ifTrue:ifFalse:
>>> - ifFalse:ifTrue:
>>> - ...
>>>
>>> ${slide:title=Lazy Logical Operators}$
>>>
>>> *LINK>@frm:really*
>>>
>>> [[[language=smalltalk
>>> false and: [1 error: 'crazy']
>>> -> false and not an error
>>> ]]]
>>>
>>> ! Exercices
>>> ${toc:depthLevel=1|level=0|highlight=1}$
>>>
>>> !! Exercise 1: Implement not
>>>
>>> ${slide:title=Exercise 1\: Implement not}$
>>>
>>> - Propose an implementation of not in a world where you do not have
>>> Booleans.
>>> - You only have objects and messages.
>>> [[[language=smalltalk
>>> false not
>>> -> true
>>>
>>> true not
>>> -> false
>>> ]]]
>>>
>>> !!Exercise 2: Implement | (Or) ifTrue: ifFalse:
>>>
>>> ${toc:depthLevel=2|level=0|highlight=1}$
>>>
>>> ${slide:title=Exercise 2\: Implement \| (Or)}$
>>>
>>> - Propose an implementation of or in a world where you do not have
>>> Booleans.
>>> - You only have objects and messages.
>>>
>>> [[[language=smalltalk
>>> true | true -> true
>>> true | false -> true
>>> true | anything -> true
>>>
>>> false | true -> true
>>> false | false -> false
>>> false | anything -> anything
>>> ]]]
>>>
>>> ${slide:title=Exercise2\: Variation - Implement ifTrue\:ifFalse\:}$
>>>
>>> - Propose an implementation of not in a world where you do not have
>>> Booleans.
>>> - You only have objects, messages and closures.
>>>
>>> [[[language=smalltalk
>>> false ifTrue: [ 3 ] ifFalse: [ 5 ]
>>> -> 5
>>> true ifTrue: [ 3 ] ifFalse: [ 5 ]
>>> -> 3
>>> ]]]
>>>
>>> ! Boolean Implementation
>>>
>>> ${toc:depthLevel=1|level=0|highlight=1}$
>>>
>>> ${slide:title=Booleans Implementation Hint One}$
>>>
>>> - The solution does not use conditionals
>>> - else we would obtain a recursive definition of ==ifTrue:ifFalse:==
>>>
>>> ${slide:title=Boolean Implementation Hint Two}$
>>>
>>> - The solution uses three classes: ==Boolean==, ==True== and ==False==
>>> - ==false== and ==true== are unique instances described by their own
>>> classes
>>> - ==false== is an instance of the class ==False==
>>> - ==true== is an instance of the class ==True==
>>>
>>> +Boolean Hierarchy>file://figures/BooleanHiearchyAndInstances.png|width=50+
>>>
>>> ${slide:title=How do we express choice in OOP?}$
>>>
>>> - We send messages to objects
>>>
>>> [[[language=smalltalk
>>> aButton color
>>> -> Color red
>>>
>>> aPane color
>>> -> Color blue
>>>
>>> aWindow color
>>> -> Color grey
>>> ]]]
>>>
>>> - Let's the receiver decide
>>>
>>> - Do not ask, tell
>>>
>>> ${slide:title=Boolean not implementation}$
>>>
>>> - Class ==Boolean== is an abstract class that implements behavior
>>> common to true and false. Its subclasses are ==True== and ==False==.
>>> Subclasses must implement methods for logical operations ==&==,
>>> ==not==, and controls ==and:==, ==or:==, ==ifTrue:==, ==ifFalse:==,
>>> ==ifTrue:ifFalse:==, ==ifFalse:ifTrue:==
>>>
>>> [[[language=smalltalk
>>> Boolean>>not
>>> "Negation. Answer true if the receiver is false, answer false if the
>>> receiver is true."
>>> self subclassResponsibility
>>> ]]]
>>>
>>> ${slide:title=Not implementation in two methods}$
>>>
>>> [[[language=smalltalk
>>> False>>not
>>> "Negation -- answer true since the receiver is false."
>>> ^ true
>>> ]]]
>>>
>>> [[[language=smalltalk
>>> True>>not
>>> "Negation--answer false since the receiver is true."
>>> ^ false
>>> ]]]
>>>
>>> ${slide:title=Not implementation in two methods}$
>>>
>>> +Not
>>> implementation.>file://figures/BooleanHiearchyAndInstancesWithNotMethods.png|width=80+
>>>
>>> ${slide:title=\| (Or)}$
>>> [[[language=smalltalk
>>>
>>> true | true -> true
>>> true | false -> true
>>> true | anything -> true
>>>
>>> false | true -> true
>>> false | false -> false
>>> false | anything -> anything
>>>
>>> ]]]
>>>
>>> ${slide:title=Boolean>> \| aBoolean}$
>>>
>>> [[[language=smalltalk
>>> Boolean>> | aBoolean
>>> "Evaluating disjunction (OR). Evaluate the argument. Answer true if
>>> either the receiver or the argument is
>>> true."
>>> self subclassResponsibility
>>> ]]]
>>>
>>> ${slide:title=False>> \| aBoolean}$
>>>
>>> [[[language=smalltalk
>>> false | true -> true
>>> false | false -> false
>>> false | anything -> anything
>>> ]]]
>>>
>>> [[[language=smalltalk
>>> False >> | aBoolean
>>> "Evaluating disjunction (OR) -- answer with the argument, aBoolean."
>>> ^ aBoolean
>>> ]]]
>>>
>>> ${slide:title=True>> \| aBoolean}$
>>>
>>> [[[language=smalltalk
>>> true | true -> true
>>> true | false -> true
>>> true | anything -> true
>>> ]]]
>>>
>>> [[[language=smalltalk
>>> True>> | aBoolean
>>> "Evaluating disjunction (OR) -- answer true since the receiver is true."
>>> ^ self
>>> ]]]
>>>
>>> ${slide:title=Or implementation in two methods}$
>>>
>>> +>file://figures/BooleanHiearchyAndInstancesWithOrMethods.png|width=80+
>>>
>>> ${slide:title=Implementing ifTrue\:ifFalse\:}$
>>>
>>> - Do you see the pattern?
>>> - Remember that a closure freezes execution and that value launches
>>> the execution of a frozen code.
>>>
>>> [[[language=smalltalk
>>> True>>ifTrue: aTrueBlock ifFalse: aFalseBlock
>>> ^ aTrueBlock value
>>> ]]]
>>>
>>> [[[language=smalltalk
>>> False>>ifTrue: aTrueBlock ifFalse: aFalseBlock
>>> ^ aFalseBlock value
>>> ]]]
>>>
>>> ${slide:title=Implementation Note}$
>>>
>>> - Note that the Virtual Machine shortcuts calls to boolean such as
>>> condition for speed reason.
>>> - But you can implement your own conditional method and debug to see
>>> that sending a message is dispatching to the right object.
>>>
>>> ! So what ?
>>>
>>> ${toc:depthLevel=1|level=0|highlight=1}$
>>>
>>> ${slide:title=Ok so what?}$
>>>
>>> - You will probably not implement another Boolean classes
>>> - So is it really that totally useless?
>>>
>>>
>>> ${slide:title=Message sends act as case statements}$
>>>
>>> - The execution engine will select the right method in the class of the
>>> receiver
>>> - The case statements is dynamic in the sense that it depends on the
>>> classes loaded and the objects to which the message is sent.
>>> - Each time you send a message, the system will select the method
>>> corresponding to the receiver.
>>>
>>>
>>> ${slide:title=A Class Hierarchy is a Skeleton for Dynamic Dispatch}$
>>>
>>> - If we would have said that the ==Boolean== would be composed of only
>>> one class, we could not have use dynamic binding.
>>> - A class hierarchy is the exoskeleton for dynamic binding
>>>
>>> - Compare the solution with one class vs. a hierarchy.
>>>
>>> +One single class vs. a nice
>>> hierarchy.>file://figures/Design-FatVsDispatch.png|width=70+
>>>
>>> - The hierarchy provides a way to specialize behavior.
>>> - It is also more declarative in the sense that you only focus on one
>>> class.
>>> - It is more modular in the sense that you can package different
>>> classes in different packages.
>>>
>>> ${slide:title=Avoid Conditionals}$
>>>
>>> - Use objects and messages, when you can
>>> - The execution engine acts as a conditional switch: Use it!
>>> - Check the AntiIfCampaign.
>>>
>>> ${slide:title=Follow-up: Implement ternary logic}$
>>>
>>> - Boolean: ==true==, ==false==, ==unknown==
>>> +Ternaru Logic decision table
>>>> file://figures/ArrayBoolean.png|width=30|label=fig:ternLogic+
>>> - Implementing in your own classes.
>>>
>>> ! Summary
>>>
>>> ${toc:depthLevel=1|level=0|highlight=1}$
>>>
>>> ${slide:title=Summary}$
>>> - Tell, do not ask
>>> - Let the receiver decide
>>> - Message sends as potential dynamic conditional
>>> - Class hiearchy builds a skeleton for dynamic dispatch
>>> - Avoid conditional
>>>
>>>
>>>
>>>
>>> -----------------------------------------
>>> [4] Bloc
>>> Load Bloc with executing in a playground (Pharo 6.1)
>>>
>>> Metacello new
>>> baseline: 'Bloc';
>>> repository: 'github://pharo-graphics/Bloc:pharo6.1/src';
>>> load: #core
>>>
>>>
>>> A tutorial to use bloc is available on
>>> http://files.pharo.org/books/
>>> Bloc Memory Game (alpha) is a first tutorial on Bloc the new graphics
>>> core for Pharo. Booklet written by A. Chis, S. Ducasse, A. Syrel.
>>>
>>> http://files.pharo.org/books-pdfs/booklet-Bloc/2017-11-09-memorygame.pdf
>>>
>>> To load the memory game
>>>
>>> Metacello new
>>> baseline: 'BlocTutorials';
>>> repository: 'github://pharo-graphics/Tutorials/src';
>>> load
>>>
>>>
>>> A similar booklet could be done for the title
>>> 'Doing a presentation / slide show / assitant with Bloc' (or similar,
>>> adapt .....)
>>>
> --
> www.tudorgirba.com
> www.feenk.com
>
> "Obvious things are difficult to teach."
>
>
>
>
>
>
Nov. 14, 2017
Re: [Pharo-users] Stream API
by Steffen Märcker
I forgot to mention, that the most recent code for Pharo is already on
Github: https://github.com/Pharophile/Transducers
Reducers was the name of the first very first implementation.
(In fact, I was originally inspired by clojures Reducers lib. After
implementing it in Smalltalk, I developed the concept further. Later I
found out, that the clojure guys did the same in parallel and ended up
with the same abstraction but a differnt name. Hence I decided change the
name in order to make the relation clear.)
Am .11.2017, 16:18 Uhr, schrieb Sven Van Caekenberghe <sven(a)stfx.eu>:
>
>
>> On 14 Nov 2017, at 16:00, Steffen Märcker <merkste(a)web.de> wrote:
>>
>> Hi,
>>
<---Schnitt--->
>>
>> No. Transducers is my side project. I've implemented a package for
>> VisualWorks. Unfortunately, I did not finish the port to Pharo yet,
>> simply due to a lack of time. Originally, transducers evolved in the
>> clojure community. I figured, the concept a good fit for Smalltalk and
>> adapted it accordingly. (My thesis is on conditional probabilities in
>> model-checking of probabilistic systems.)
>>
<---Schnitt--->
>>
>> http://www.cincomsmalltalk.com/publicRepository/Transducers.html
>> https://clojure.org/reference/transducers
>> Plus some mails on this list and more on the vwnc list. Feel free to
>> ask; I understand, that the package comment has lots of potential for
>> improvement to help understanding.
>>
>> Best, Steffen
>
> Some code seems to be here: http://smalltalkhub.com/#!/~cdlm/Experiments
>
> Not sure if it is complete or what the relation is, or the difference
> between transducers and reducers ...
>
>
Nov. 14, 2017
Re: [Pharo-users] Stream API
by Sven Van Caekenberghe
> On 14 Nov 2017, at 16:00, Steffen Märcker <merkste(a)web.de> wrote:
>
> Hi,
>
>> Are transducers the subject of your thesis ?
>
> No. Transducers is my side project. I've implemented a package for VisualWorks. Unfortunately, I did not finish the port to Pharo yet, simply due to a lack of time. Originally, transducers evolved in the clojure community. I figured, the concept a good fit for Smalltalk and adapted it accordingly. (My thesis is on conditional probabilities in model-checking of probabilistic systems.)
>
>> Any pointers to more information ?
>
> http://www.cincomsmalltalk.com/publicRepository/Transducers.html
> https://clojure.org/reference/transducers
> Plus some mails on this list and more on the vwnc list. Feel free to ask; I understand, that the package comment has lots of potential for improvement to help understanding.
>
> Best, Steffen
Some code seems to be here: http://smalltalkhub.com/#!/~cdlm/Experiments
Not sure if it is complete or what the relation is, or the difference between transducers and reducers ...
Nov. 14, 2017
Re: [Pharo-users] QCMagritte on Github
by Todd Blanchard
Found this on /r/programming today. Seemed relevant. Gist is that YAML spec is ambiguous and implementations seem to disagree widely on proper interpretation.
https://github.com/cblp/yaml-sucks
> On Nov 10, 2017, at 10:37 AM, Andrew Glynn <aglynn42(a)gmail.com> wrote:
>
> YAML is what it says, lol.
>
> I still prefer using SGML and outputting whatever markup I need, although I have to use US army software (that only works on Windows) to do it since Adobe gouges for FrameMaker.
>
> Probably a long lasting hangover from working for IBM years ago. Sure was a headache, so a hangover isnât that surprising.
>
> Looking for the latest version of that software for a new Win 10 install I came across one of the best quotes on Windows, especially considering the source, though the quote mustâve been written about an old version.
>
> âWith luck, this will start Windows, and a dialogue box will appear and tell you the default drive into which IADS will be installed (C:).
>
> If Windows doesn't start up, you could always try launching Windows manually.â
>
>
> Andrew
>
>
> From: Stephane Ducasse <mailto:stepharo.self@gmail.com>
> Sent: Friday, November 10, 2017 1:21 PM
> To: Any question about pharo is welcome <mailto:pharo-users@lists.pharo.org>
> Subject: Re: [Pharo-users] QCMagritte on Github
>
> For your information.
> We got some problem with travis (what a bad idea to have a syntax like
> yaml - our industry is looping , even xml is better).
> we spent more than 30 min trying with Guille and Andrew to use bash in
> a script section (while this is working in some guille project)
> it does not in other just because yaml does not know who to find the
> end of a line....
>
> Terrible!
>
> Stef
>
> On Wed, Nov 8, 2017 at 8:15 AM, stephan <stephan(a)stack.nl> wrote:
> > On 27-10-17 12:39, laurent laffont wrote:
> >>
> >> Hi,
> >>
> >> my team starts to use QCMagritte. For our needs we have imported
> >> SmalltalkHub repository to Github here:
> >> https://github.com/Afibre/QCMagritte
> >>
> >> I don't know if you (Diego, Stephan, Tobias) plan to use Github
> >> instead of SmalltalkHub. At least Github allows branches & pull
> >> request.
> >
> >
> > Definitely, and I'm still struggling a bit with Iceberg. I would definitely
> > favor a setup where the whole open source part is build on each commit using
> > travis and images are put on (e.g.) bitbucket.
> > The current jenkins builds are waiting for Diego to finish some changes, and
> > he is a bit distracted with plans for a new house.
> >
> > Tobias told me he's also interested, so I assume he'll provide a modified
> > baseline for other platforms.
> >
> > At a certain point we might want to fold all of QCMagritte back into
> > Magritte, but that is a discussion for later I think.
> >
> > Stephan
> >
> >
Nov. 14, 2017
Re: [Pharo-users] Stream API
by Steffen Märcker
Hi,
> Are transducers the subject of your thesis ?
No. Transducers is my side project. I've implemented a package for
VisualWorks. Unfortunately, I did not finish the port to Pharo yet, simply
due to a lack of time. Originally, transducers evolved in the clojure
community. I figured, the concept a good fit for Smalltalk and adapted it
accordingly. (My thesis is on conditional probabilities in model-checking
of probabilistic systems.)
> Any pointers to more information ?
http://www.cincomsmalltalk.com/publicRepository/Transducers.html
https://clojure.org/reference/transducers
Plus some mails on this list and more on the vwnc list. Feel free to ask;
I understand, that the package comment has lots of potential for
improvement to help understanding.
Best, Steffen
Nov. 14, 2017
Re: [Pharo-users] Stream API
by Sven Van Caekenberghe
> On 14 Nov 2017, at 15:33, Steffen Märcker <merkste(a)web.de> wrote:
>
> Hi!
>
>>> Yes, I agree, Xtreams is much better (but steep learning curve).
>>>
>>> I just wanted to point out that my contributions in Zn streams focus and
>>> better/simpler byte/character IO.
>>
>> Yes, and it is really nice.
>> Interesting how many users we have in system for general streams? (created on arbitrary collections).
>
> I really think streams (in general) should focus on what they are best at. Namely, (stepwise) reading and writing from and to various sources, and buffering for efficiency, too. XStreams does an excellent job here. However, higher level operations - like collecting, selecting, splitting (map, filter, partition) and such - should be addressed by other means. Those operations apply to streams, collections, generators and other data structures. They can efficiently be implemented independent from the data structure. By doing so, code duplication can be avoided and the API of streams, etc. can be kept simple.
>
> Although I won't have time to contribute code, before finishing my thesis, I'd like to point out, that transducers are here to address exactly this. The package already works with collections, streams and xstreams.
Are transducers the subject of your thesis ?
Any pointers to more information ?
> Best,
> Steffen
>
Nov. 14, 2017
Re: [Pharo-users] Stream API
by Steffen Märcker
Hi!
>> Yes, I agree, Xtreams is much better (but steep learning curve).
>>
>> I just wanted to point out that my contributions in Zn streams focus and
>> better/simpler byte/character IO.
>
> Yes, and it is really nice.
> Interesting how many users we have in system for general streams?
> (created on arbitrary collections).
I really think streams (in general) should focus on what they are best at.
Namely, (stepwise) reading and writing from and to various sources, and
buffering for efficiency, too. XStreams does an excellent job here.
However, higher level operations - like collecting, selecting, splitting
(map, filter, partition) and such - should be addressed by other means.
Those operations apply to streams, collections, generators and other data
structures. They can efficiently be implemented independent from the data
structure. By doing so, code duplication can be avoided and the API of
streams, etc. can be kept simple.
Although I won't have time to contribute code, before finishing my thesis,
I'd like to point out, that transducers are here to address exactly this.
The package already works with collections, streams and xstreams.
Best,
Steffen
Nov. 14, 2017