Hi,

We changed the baseline to not require Moz2D on Linux. Could you please try 
again?

I also updated the README.

Cheers,
Doru


> On Nov 14, 2017, at 6:25 PM, Offray Vladimir Luna Cárdenas 
> <offray.l...@mutabit.com> wrote:
> 
> Alex,
> I understand that frustration on installation could be motivated by other 
> issues instead of GT Documenter, but if the team ask to use "Iceberg 
> enableMetacelloIntegration: true." in the project readme, where it also says 
> that is supported for Pharo 6.1 and 7.0, is natural to think that something 
> is wrong with documentation and/or in the project's expectations about its 
> intended users and their will to invest the effort, time and motivation for 
> "living in the edge". I understand that if we want stuff to be improved it 
> should be tested, but also that not all the people that is willing to test 
> stuff for Pharo 6.1 needs to live in such edge. Or the project is sending a 
> message that is not giving the bests firsts impressions, or is going to users 
> which are not intended . I would go for a smooth install first and then for 
> collaboration with git. I'll make a pull request with the proposal for a 
> better documentation, but my understanding about how you can go from the 
> first (user of GT Documenter) to the second (developer using Git integration) 
> is not clear.
> 
> GT Tools has been pretty empowering. I have told that several times and I 
> don't think that I have wrote a single line of code in their repos. But is 
> getting more difficult just to test and use them and I think that is related 
> with the idea that my user *needs* to be also my co-developer, starting with 
> their ssh git key pair. If we don't make easier to contribute by just making 
> easier to install, there will be no evolution either.
> 
> Cheers,
> 
> Offray
> 
> On 14/11/17 11:45, Aliaksei Syrel wrote:
>> Hi Offray,
>> 
>> I understand your frustration, but with all respect, the fact that you have 
>> problems with Iceberg does not mean that GT Documenter or any other GT tool 
>> is responsible for described problems.
>> 
>> Most complains about bloc, brick, whatever is because of unrelated stuff. It 
>> is a little bit disappointing. Especially for me, as one of the maintainers. 
>> But it is ok, I got used to it :)
>> 
>> I don’t remember when last time I used stable Pharo (not because it does not 
>> exist), simply live on the edge since Pharo4. If no one will use Git and 
>> report problems Iceberg will never progress. If no one will use Bloc it will 
>> never get “there”. Unfortunately, living on the edge is dangerous, requires 
>> effort, motivation and time.
>> 
>> The script that Doru provided works flawlessly on OSX, we load it almost 
>> everyday. !! Bloc is tested on CI and builds are green on Windows, Linux and 
>> OSX !!. If computer (CI) manages to install it, I am pretty sure human can 
>> do it too. Looks like there is something missing in your configuration, 
>> something tiny :) Error handling in Iceberg can be definitely improved, but 
>> it is a different story.
>> 
>> P.S. Documenter can be installed without enabled Iceberg integration. This 
>> is how CI does it. You will just not be able to contribute.
>> 
>> Cheers,
>> Alex
>> 
>> On Tue, 14 Nov 2017 at 16:37, Offray Vladimir Luna Cárdenas 
>> <offray.l...@mutabit.com> wrote:
>> 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-the-ssh-agent/#generating-a-new-ssh-key
>> [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 
>> g...@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-around-specs-textmodel-44ba2e2b1ab9
>> 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.hir...@gmail.com>
>>>>  wrote:
>>>> 
>>>> A note:
>>>> 
>>>> Tudor Girba wrote:
>>>> 
>>>> <tu...@tudorgirba.com>
>>>>    Fri, Aug 25, 2017 at 1:31 PM
>>>> Reply-To: Any question about pharo is welcome 
>>>> <pharo-users@lists.pharo.org>
>>>> 
>>>> To: Any question about pharo is welcome 
>>>> <pharo-users@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.hir...@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.s...@gmail.com>
>>>>>   Fri, Aug 11, 2017 at 7:09 PM
>>>>> To: Any question about pharo is welcome 
>>>>> <pharo-users@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-Templates/SlideExample.pillar
>>>>> 
>>>>> 
>>>>> {
>>>>>   "title":"To the Roots of Objects",
>>>>>   "subtitle":"Learning from beauty",
>>>>>   "author":"Stephane Ducasse",
>>>>>   "complement":
>>>>> "http://stephane.ducasse.free.fr/ \\\\
>>>>> stephane.duca...@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."
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>> 
>> -- 
>> Cheers,
>> Alex
> 

--
www.tudorgirba.com
www.feenk.com

"There are no old things, there are only old ways of looking at them."





Reply via email to