[Seaside] show:onAnswer:

Lukas Renggli renggli at gmail.com
Tue Apr 27 05:59:08 UTC 2010


> The Seaside book mentions that show:onAnswer: is complicated when there are
> loops present.
> http://book.seaside.st/book/components/calling/show-answer
>
> Can anyone expand on that a bit, perhaps with an example?

Yeah, let me give some examples.

First for a sequence of call:'s this is simple:

   Task>>go
      | a b c |
      a := self call: A.
      b := self call: B.
      c := self call: C.

is the same as

   Task>>go
      self show: A onAnswer: [ :a |
          self show: B onAnswer: [ :b |
              self show: C onAnswer: [ :c | ] ] ]

Now for a simple loop

   Task>>go
       [ self call: A ] whileTrue: [ self call: B ]

things get a bit more tricky. The example below shows a possible
equivalent piece of code. It uses recursion to implement the loop:

   Task>>go
       self show: A onAnswer: [ :a |
           a ifTrue: [
               self show: B onAnswer: [ :b | self go ] ] ]

The technique applied here is continuation-passing style (CPS). The
#onAnswer: block is always used to continue in the flow. Unfortunately
it leads quite quickly to pretty messy code if the flow is more
complicated. So I wouldn't suggest to use it unless you have to. Also
given that in Seaside 3.0 #call: is almost free :-)

Lukas

-- 
Lukas Renggli
www.lukas-renggli.ch


More information about the seaside mailing list