Hi,

The readme is clearer now about Iceberg integration as an option not as
prerequisite. Installation works, but Pillar preview tab is grey and
clicking on it rises: "Instance of FFIExternalResourceManager class did
not understand #removeResource:". Also the syntax highlighting in the
(plain) Pillar tab is not working and neither the image preview. A plain
installation of just Pillar (without GT Documenter) got those two
working once.

Cheers,

Offray 


On 14/11/17 12:37, Tudor Girba wrote:
> 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