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."