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