Hi Offray, Please do not forget to try and let us know if it works now.
Cheers, Doru > On Nov 15, 2017, at 9:20 AM, Tudor Girba <tu...@tudorgirba.com> wrote: > > Hi Offray, > > Alex took a look at your specific distro and he found and fixed your issue. > > Please try again installing GT/Bloc from scratch in a fresh Pharo 6.1 image. > > Please also note that the rendering on Linux is not using Moz2D so it will > not be as beautiful as in pictures. The reason for this is that there are > external dependencies that are required and we would need help to figure that > setup. > > Cheers, > Doru > > >> On Nov 14, 2017, at 10:07 PM, Offray Vladimir Luna Cárdenas >> <offray.l...@mutabit.com> wrote: >> >> 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 >>>>>>>> >>>>>>>> [[[label=helloScript|caption=How to print Hello >>>>>>>> World|language=Smalltalk >>>>>>>> Transcript show: 'Hello World'. >>>>>>>> \]]] >>>>>>>> >>>>>>>> >>>>>>>> 7. Raw >>>>>>>> >>>>>>>> >>>>>>>> {{{latex: >>>>>>>> this is how you inject raw \LaTeX in your output file >>>>>>>> }}} >>>>>>>> >>>>>>>> {{{markdown: >>>>>>>> this is how you inject raw `markdown` in your output file >>>>>>>> }}} >>>>>>>> >>>>>>>> {{{html: >>>>>>>> this is how you inject raw <b>html</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." >>> >>> >>> >>> >>> >>> >> >> >> > > -- > www.tudorgirba.com > www.feenk.com > > "From an abstract enough point of view, any two things are similar." > > > > -- www.tudorgirba.com www.feenk.com "Reasonable is what we are accustomed with."