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





Reply via email to