Re: seaside by example RPN example
Nicolai Hess <[email protected]>
| Newsgroups | gmane.comp.lang.smalltalk.squeak.seaside |
|---|---|
| Message-ID | <CAPED3SQa+4snDFraC3ch9APW0fyU+QTid37Xic9dKLeAxnXf-A@mail.gmail.com> |
2016-12-18 21:31 GMT+01:00 Sven Van Caekenberghe <[email protected]>: > 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 <[email protected]> wrote: > > > >> > >> On 18 Dec 2016, at 16:42, Nicolai Hess <[email protected]> wrote: > >> > >> > >> > >> 2016-12-18 14:06 GMT+01:00 Sven Van Caekenberghe <[email protected]>: > >> 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 <[email protected]> wrote: > >>> > >>> > >>> > >>> 2016-12-16 22:06 GMT+01:00 Nicolai Hess <[email protected]>: > >>> > >>> > >>> 2016-12-15 14:46 GMT+01:00 Nicolai Hess <[email protected]>: > >>> 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 > >>> [email protected] > >>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > >> > >> _______________________________________________ > >> seaside mailing list > >> [email protected] > >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > >> > >> _______________________________________________ > >> seaside mailing list > >> [email protected] > >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > > _______________________________________________ > seaside mailing list > [email protected] > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > _______________________________________________ seaside mailing list [email protected] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside