[Seaside] seaside by example RPN example

Nicolai Hess nicolaihess at gmail.com
Mon Dec 19 22:06:25 UTC 2016


2016-12-18 21:31 GMT+01:00 Sven Van Caekenberghe <sven at stfx.eu>:

> Hi Nicolai,
>
>
Hi :) Thanks for looking into this.


> I used the code that I found @
>
> MCSmalltalkhubRepository
>         owner: 'onierstrasz'
>         project: 'PharoByExample'
>         user: ''
>         password: ''.
>
> (SqueakSource acted really strange).
>
> I had to change the registration, like you said.
>
> Inside callbacks it is safe to change state.
>
> I got the code to work by modifying (added line before last)
>
> RPNKeypad>>#type: aString
>         self inPushMode ifTrue: [
>                 stackMachine push: stackMachine top.
>                 self stackClearTop ].
>         self inClearMode ifTrue: [ self stackClearTop ].
>         stackMachine isEmpty ifTrue: [ stackMachine push: 0 ].
>         stackMachine push: (stackMachine pop asString, aString) asNumber.
>
> #type: is called from inside callbacks.
>
> Removing the #ensureStackMachineNotEmpty call in  #renderContentOn: does
> not work, so this remain all quite fishy.
>
> StackMachine is a model of a mathematical RPN calculator, not one with a
> keypad and modes.
>
> In my HP-35 code, there is RPNCalculatorCore for the mathematical
> abstraction and HP35CalculatorModel for the thing with the keys, input
> modes, etc.
>
> If the example UI cannot work with an empty stack, then maybe it should
> always be initialized with one containing 0, as an invariant ?
>
> The problem is that too many operations allow the model to go into error
> (esp. depleting the stack).
>

I think I will stick with the ensureStackMachineNotEmpty call, otherwise I
need to initialize the stack with 0 as top.
And I will guard the keypad stack operations to not operate on an empty
stack.


>
> Sven
>
> > On 18 Dec 2016, at 17:42, Sven Van Caekenberghe <sven at stfx.eu> wrote:
> >
> >>
> >> On 18 Dec 2016, at 16:42, Nicolai Hess <nicolaihess at gmail.com> wrote:
> >>
> >>
> >>
> >> 2016-12-18 14:06 GMT+01:00 Sven Van Caekenberghe <sven at stfx.eu>:
> >> Hi Nicolai,
> >>
> >> This article of mine: https://medium.com/concerning-
> pharo/rediscovering-the-ux-of-the-legendary-hp-35-
> scientific-pocket-calculator-d1d497ece999 contains two Seaside RPN
> calculator web apps based on a pure domain model. You can find the web
> stuff towards the end, you will probably have to skip some intro stuff in
> between. The appendix explains how to get the code. I hope it all still
> works.
> >>
> >> Thanks for your response,
> >> yes, it still works, but it does not really helps me, as it does not
> have to care about an empty stack or changes state before rendering.
> >
> > I will (re)read section 12.7 in my physical copy of the book and come
> back to you.
> >
> > But from a theoretical standpoint, the model should just always be
> consistent in itself, independent of the (web) UI, in my opinion.
> >
> >> Sven
> >>
> >>> On 18 Dec 2016, at 13:27, Nicolai Hess <nicolaihess at gmail.com> wrote:
> >>>
> >>>
> >>>
> >>> 2016-12-16 22:06 GMT+01:00 Nicolai Hess <nicolaihess at gmail.com>:
> >>>
> >>>
> >>> 2016-12-15 14:46 GMT+01:00 Nicolai Hess <nicolaihess at gmail.com>:
> >>> Hi,
> >>>
> >>> anyone knows the seaside example from the pharo by example book:
> >>>
> >>> SBE2-SeasideRPN-on.1
> >>>
> >>> MCSqueaksourceRepository
> >>>    location: 'http://www.squeaksource.com/SqueakByExample'
> >>>    user: ''
> >>>    password: ''
> >>>
> >>> I can not get it to work. On Seaside 3.0 you need to change the class
> initialization,
> >>> because the application registration had changed.
> >>> But despite that, the calculator does not work. Everytime I push on a
> number
> >>> I get a empty-collection-error.
> >>> I don't understand why, because the rendering of the calculator stack
> >>> calls a method ensureStackMachineNotEmpty, that puts a 0 onto the
> stack.
> >>> Now, pushing a keypad button for a number, will pop this element and
> convert both
> >>> the existing number and the new number to a new number.
> >>> But somehow the stack is empty, eventhough we call
> ensureStackMachineNotEmpty.
> >>>
> >>> Anyone has experience with this example or can find out what is wrong ?
> >>> I don't have much experience with seaside.
> >>>
> >>> thanks in advance.
> >>>
> >>> Ah, on seaside 3.0 the current (initial state) of the StackMachine is
> saved once before the rendering (WASnapshot), and if we modify the stack
> machine state (the OrderedCollection)
> >>> during #renderContentsOn:, the prior state (with the empty stack) is
> restored before executing the callbacks.
> >>> This had changed, in seaside 2.8, saving the state snapshots happens
> first after the initial rendering.
> >>> Was this change on purpose ? Is there some information about, when it
> is  allowed to modify the state during rendering ?
> >>>
> >>> I guess we may have to make sure that any state changes are happening
> outside of the rendering, is there some ~pattern~ to follow, when it is
> save to change states ?
> >>>
> >>> thanks in advance
> >>>
> >>> nicolai
> >>>
> >>>
> >>>
> >>> Ok I found a hint in http://book.seaside.st/book/
> fundamentals/anchors/about-callbacks
> >>> "Important : Do not change state while rendering....."
> >>>
> >>> Ok, so the old RPNCalculator example does not work anymore if we try
> to "ensure the stack is not empty" during then renderContentsOn: method.
> >>> Now I need to find a way to ensure the stackmachine non-emptyness
> before doing the rendering.
> >>>
> >>> Is there a hook, called before the rendering, that *can* change the
> component state ?
> >>>
> >>>
> >>> _______________________________________________
> >>> seaside mailing list
> >>> seaside at lists.squeakfoundation.org
> >>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >>
> >> _______________________________________________
> >> seaside mailing list
> >> seaside at lists.squeakfoundation.org
> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >>
> >> _______________________________________________
> >> seaside mailing list
> >> seaside at lists.squeakfoundation.org
> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/seaside/attachments/20161219/dd1a8502/attachment.html>


More information about the seaside mailing list