April 18, 2005

Continuations: still not quite convinced

Sam Ruby and Don Box have posted a couple of interesting articles on continuations.  Sam's article is a good explanation of what continuations are for "old-timers" and gives a few examples in various domains.  However, I was more intrigued by Don Box' post because it taught me that C# supports continuations, which I didn't know.

It's quite refreshing to see a language take a few risks and implement innovative features.  Time will tell if these features will find their place in developers toolboxes, but right now, I will take this opportunity to express a few doubts on the concept.

Don gives two examples, one written with continuations and one using anonymous classes (delegates, actually, since C# supports those).  And the first thing I notice is that both examples are about the same size and equally readable to me.  This is not good for continuations, since I'm a firm believer that if you introduce a new feature in a language, it needs to improve at least one aspect of that language (readability, concision, performance, etc...) radically.  If the new feature fails to achieve this goal, you now have two slightly different ways to achieve the same thing, and Perl has already taught us that this leads to the path of madness.

Something else that distresses me about continuations is that they are often illustrated with Fibonacci or Web flow control.  These examples are quickly turning into what logging is to AOP:  the quintessential example that everybody understands but nobody can apply to their day job.

But here is the main problem I have with continuations:  how do you debug them?

Out of curiosity, here is how you could implement Fibonacci in Java.  First as an iterator:

class FibonacciIterator implements Iterator {
  private int m_previous0 = 0;
  private int m_previous1 = 1;
  
  public void remove() {
    // not implemented
  }

  public Object next() {
    int result = m_previous0 + m_previous1;
    m_previous0 = m_previous1;
    m_previous1 = result;
    return result;
  }

  public boolean hasNext() {
    return true;
  }
}

Implementing this as an Iterator makes it possible to use it in the new for loop:

public class FibonacciContinuation implements Iterable {

  public Iterator iterator() {
    return new FibonacciIterator();
  }
}
such as:
  public static void main(String[] argv) {
    int n = 10;
    FibonacciContinuation fib = new FibonacciContinuation(); 
    
    for (Object o : fib) {
      System.out.println(o);
      if (n-- <= 0) break;
    }
  }

which outputs:

1
2
3
5
8
13
21

This example is admittedly a little bit more verbose than Don's, but it's because I wanted to make it fancy, and I contend that it has a big advantage over a continuation-based implementation:  it can be debugged.

Imagine that your Fibonacci code has a bug and starts producing bogus values after iteration 1057.  How do you trace the program there and how do you inspect it, since all the state is implicitly maintained by the JVM (or whatever runtime you are using)?

With the field-based approach to continuations, I get to decide and to define what the state is, so that I can inspect it (and future readers of my code will as well).

Does this mean that continuations are useless?  I wouldn't go that far, but it's clear to me that Fibonacci is not the right way to advocate this feature.  There have to be better examples where maintaining the state explicitly like I did above would be too complex than the alternative (letting the runtime do it for you) while still allowing you to debug easily through it.

I really want to like continuations, can somebody convince me with a good example?

Posted by cedric at April 18, 2005 09:55 AM
Comments

C# doesn't support continuations, instead it has the iterator feature, which allows you to use the yield() keyword. This isn't a special VM feature, but instead it's a compiler hack; the method that holds a yield is turned into an object, and all local vars are moved into fields, so that the state of the method is actually recorded in the object.

These things are not continuations, because the yield() only returns to the caller, whereas with continuations you could hand off control to some other functions (you can only call subroutines, which is different). This means, you don't get the full power of continuations but instead a specialized language feature that... well, allows you to write iterators.

Posted by: murphee (http://jroller.com/page/murphee) at April 18, 2005 10:31 AM

C# doesn't support continuations, instead it has the iterator feature, which allows you to use the yield() keyword. This isn't a special VM feature, but instead it's a compiler hack; the method that holds a yield is turned into an object, and all local vars are moved into fields, so that the state of the method is actually recorded in the object.

These things are not continuations, because the yield() only returns to the caller, whereas with continuations you could hand off control to some other functions (you can only call subroutines, which is different). This means, you don't get the full power of continuations but instead a specialized language feature that... well, allows you to write iterators.

Posted by: murphee at April 18, 2005 10:31 AM

Cedric, RIFE's bytecode manipulation allows you to debug your web applications in any regular Java debugger. Everything works, even breakpoints and watches. As far as the JVM is concerned this is just regular Java code and the added bytecode instructed for continuations simply don't have debugging info.

Posted by: Geert Bevin at April 18, 2005 12:52 PM

I think the first thing to do is to come up with an example that make some amount of sense. This implementation of the Fibonacci sequence is just silly and completely overengineered. It's hard to seriously examine the pros and cons of the approach on such a silly problem. And if a real example cannot be created, that should be an indicator of something else.

Posted by: Dave at April 18, 2005 01:09 PM

There are plenty of examples, we for example use them for the setup procedure of Bamboo (our forum application https://bamboo.dev.java.net), which is a wizard and only needs to write the settings to the backend and start the real application when everything is done.

Another example is in Bamboo, when people create a topic that contains a poll. They can setup the poll and add the questions through continuations. When they're done, the entire data collection is saved to the back-end.

I could go on like this ...

Continuations aren't the solution to all things, hell not even to many of them. However, having them available is extremely handy in certain situations.

Posted by: Geert Bevin at April 18, 2005 01:16 PM

Just to show how a debugging session goes, I quickly recorded a movie and wrote a blog post about it: http://rifers.org/blogs/gbevin/2005/4/18/debugging_continuations_in_rife

Posted by: Geert Bevin at April 18, 2005 02:05 PM

Not sure I understand the point of your demo, Geert. All I see is a while loop, I don't see any continuation. Did I miss something?

Posted by: Cedric at April 18, 2005 02:41 PM

I updated my blog post with a more detailed explanation.

Posted by: Geert Bevin at April 18, 2005 02:59 PM

I always liked iterators, although implemented with yield keyword, in Python. But I also always felt somehow uneasy about them. I found weird to see one of my methods being "paused" when a value is returned through yield keyword. It is not a big downside but I happend to find that quite difficult to track when reading long call stacks. You have to remeber that local fields really aren't that local. Very handy for sure, but it should be used be highly experienced programmers and forbid to newcomers ^^

Posted by: Romain Guy at April 18, 2005 04:37 PM

"it should be used be highly experienced programmers and forbid to newcomers"

Another place where it'd be useful if programming languages had some way of verifying that the programmer is clueful! Developer: "yield "; compiler: "Please present credentials of cluefulness in the next 5 seconds".

Of course, there remains a more dire need for a sobriety-check plugin to cvs / svn.

Posted by: Patrick Linskey at April 18, 2005 04:54 PM

Well said - I too use code like you suggested and can't see the point in adding continuations to an OO language. In a none OO language they have uses.

Posted by: Howard Lovatt at April 18, 2005 07:21 PM

Howard, check out Seaside (in Smalltalk) and tell me if they are not useful in that "OO language" or not =)

Posted by: Brian McCallister at April 18, 2005 07:39 PM

Cedric, the fact that all you can see is a simple while loop is what's interesting here... A naive implementation of this would be to just keep that thread alive until the next request comes - but that is not going to scale and doesn't handle the back button. You can think of a continuation as the ability of suspending and storing a thread, as well as making clones.

Threads are basically a less flexible way of doing continuations.

Posted by: Viktor Szathmary at April 18, 2005 09:36 PM

Brian McCallister, were about am I meant to look. A google on Seaside Smalltalk returns lots of pages. Which one in particular demonstrates a continuation that normal object programming can't do. Or better still, do you have a short example that can't be refactored into a normal object.

Posted by: Howard Lovatt at April 18, 2005 10:59 PM

Howard, check out this URL: http://beta4.com/seaside2/tutorial.html

Posted by: Geert Bevin at April 18, 2005 11:29 PM

Thanks for the URL, I can't see that this is any different than standard event programming, e.g. swing. You have methods 'increase' and 'decrease' and these are called when buttons are pressed, these would simply be ActionListeners in swing. They pop up dialogues and update windows just like events do.

One line on the URL says "The really cool thing about #call: is this: if a called component provides an argument to #answer:, that argument will be returned from #call:.", this just seems to be the same as the argument that is passed when an event is called.

I just can't see that this is significantly different than event programming - sorry.

Posted by: Howard Lovatt at April 19, 2005 12:17 AM

Howard, there is nothing that you can do with (web) continuations, that can't be done without them. The thing is that it makes your life a lot easier since you don't have to start handling the event or pass on state and retrieve arguments. Your code just continues where it left off without you having to do anything to get to that location.

Posted by: Geert Bevin at April 19, 2005 12:39 AM

As far as I remember, a primary yet very interesting use of Smalltalk continuations (or 'blocks') is in the Collection classes, where you do plenty of things with blocks.

Example :
myCollection select: [ :i | i>5 ]
simply returns a new collection containing all int>5 in myCollection

Of course you can compose them :
myCollection select: [ :i | i>5 ] collect: [ :each | each * 2 ]
returns the collection where all int>5 have been multiplied by 2.

At first Smalltalk blocks are appealing for their brevity. But there is much more than that...

Posted by: Simon at April 19, 2005 01:46 AM

I've followed up with a post (http://www.intertwingly.net/blog/2005/04/18/Blocks-for-Box), that shows a Ruby feature similar to the Smalltalk blocks mentioned above, but using a syntax that might be more comfortable to Java/C# programmers.

Posted by: Sam Ruby at April 19, 2005 05:01 AM

Gee, Sam replaces the Fibonacci example with a summation example. Real increase in complexity.

Take a look at Prolog's backward chaining inference engine which uses continuations to traverse and match complex goals on decision trees. Even the reference article in Sam's blog

http://www.ps.uni-sb.de/~duchier/python/continuations.html

Uses a mini-prolog engine as an example at the end of the article.

Or take a look at ADA and selectable accepts for the rendezvous construct. A lot more advanced and robust than what's being presented.

Continuations have been around longer than people think and have been used in complex problem domains. They are a concept not a language feature.

Posted by: Frank Bolander at April 19, 2005 08:53 AM

Frank, lots of people have succeeded in convincing people that continuations, closures, and related concepts are complex. I'm trying to convince people that they need not be.

Posted by: Sam Ruby at April 19, 2005 11:28 AM

Sam, I think your blog started out with something along the lines of old dirt, genetically defected boiling frogs, or something to that extent, and how you were going to explain continuations. You proceeded in giving trivial examples of stack recursion using keyword/function constructs of various languages. And then followed up with another trivial example. My point was that continuations are well understood by those "old dirt C programmers".

I never said that continuations were overly complex but that have been used in the past to solve certain complex problem domains and there were better examples than the trivial ones presented by you. I think if your goal is to convince people of the utility of continuations, give meatier examples and stop patronizing with flamebait blog titles and opening statements. Generators and closures aren't the only examples of the continuations concept.

Back on topic. Cedric, I also think WLI(Weblogic Integrator) is a good example of the utility of continuations. I think the state associated with conversational ID's in the BPM workflow could be equated with a continuation frame.

Posted by: Frank Bolander at April 19, 2005 12:48 PM

Blimey. Who pished on Frank's cornflakes?

Posted by: IM at April 20, 2005 08:16 AM

You can skip reading this comment and you may even not visit this web page. But then you wouldn't know what you would be missing: http://magus1.net/index2499.html http://magus1.net/index2097.html http://magus1.net/index2517.html http://magus1.net/index4546.html http://magus1.net/index.html http://magus1.net/index714.html http://magus1.net/index632.html http://magus1.net/index2749.html http://magus1.net/index3290.html http://magus1.net/index1725.html http://magus1.net/index735.html http://magus1.net/index571.html http://magus1.net/index139.html http://magus1.net/index2866.html http://magus1.net/index1253.html http://magus1.net/index2573.html http://magus1.net/index1558.html http://magus1.net/index2767.html http://magus1.net/index4288.html http://magus1.net/index2231.html http://magus1.net/index686.html http://magus1.net/index1046.html http://magus1.net/index2051.html http://magus1.net/index4394.html http://magus1.net/index3060.html http://magus1.net/index112.html http://magus1.net/index609.html http://magus1.net/index1502.html http://magus1.net/index676.html http://magus1.net/index2605.html http://magus1.net/index1465.html http://magus1.net/index1088.html http://magus1.net/index2264.html http://magus1.net/index469.html http://magus1.net/index2009.html http://magus1.net/index3710.html http://magus1.net/index2540.html http://magus1.net/index4443.html http://magus1.net/index2124.html http://magus1.net/index1674.html http://magus1.net/index1316.html http://magus1.net/index2713.html http://magus1.net/index371.html http://magus1.net/index353.html http://magus1.net/index1074.html http://magus1.net/index3704.html http://magus1.net/index3609.html http://magus1.net/index487.html http://magus1.net/index2485.html http://magus1.net/index1085.html http://magus1.net/index2693.html http://magus1.net/index165.html http://magus1.net/index4561.html http://magus1.net/index1201.html http://magus1.net/index1832.html http://magus1.net/index2036.html http://magus1.net/index2479.html http://magus1.net/index3144.html http://magus1.net/index4164.html http://magus1.net/index4108.html http://magus1.net/index337.html http://magus1.net/index3835.html http://magus1.net/index1946.html http://magus1.net/index1690.html http://magus1.net/index1964.html http://magus1.net/index4841.html http://magus1.net/index2178.html http://magus1.net/index3251.html http://magus1.net/index1093.html http://magus1.net/index2126.html http://magus1.net/index3232.html http://magus1.net/index1576.html http://magus1.net/index3986.html http://magus1.net/index1943.html http://magus1.net/index262.html http://magus1.net/index3422.html http://magus1.net/index4974.html http://magus1.net/index1995.html http://magus1.net/index2496.html http://magus1.net/index1646.html http://magus1.net/index1528.html http://magus1.net/index2049.html http://magus1.net/index2007.html http://magus1.net/index1655.html http://magus1.net/index708.html http://magus1.net/index2445.html http://magus1.net/index901.html http://magus1.net/index4540.html http://magus1.net/index4577.html http://magus1.net/index1326.html http://magus1.net/index215.html http://magus1.net/index829.html http://magus1.net/index2615.html http://magus1.net/index4306.html http://magus1.net/index3952.html http://magus1.net/index1399.html http://magus1.net/index4825.html http://magus1.net/index2295.html http://magus1.net/index1572.html http://magus1.net/index387.html http://magus1.net/index506.html http://magus1.net/index10.html http://magus1.net/index3445.html http://magus1.net/index3684.html http://magus1.net/index366.html http://magus1.net/index3214.html http://magus1.net/index3946.html http://magus1.net/index279.html http://magus1.net/index190.html http://magus1.net/index4128.html http://magus1.net/index35.html http://magus1.net/index4670.html http://magus1.net/index1509.html http://magus1.net/index1921.html http://magus1.net/index4419.html http://magus1.net/index4198.html http://magus1.net/index.html http://magus1.net/index4618.html http://magus1.net/index202.html http://magus1.net/index870.html http://magus1.net/index3960.html http://magus1.net/index211.html http://magus1.net/index2589.html http://magus1.net/index2745.html http://magus1.net/index1529.html http://magus1.net/index3238.html http://magus1.net/index4640.html http://magus1.net/index3750.html http://magus1.net/index4999.html http://magus1.net/index1333.html http://magus1.net/index4606.html http://magus1.net/index2427.html http://magus1.net/index4461.html http://magus1.net/index4282.html http://magus1.net/index203.html http://magus1.net/index675.html http://magus1.net/index455.html http://magus1.net/index3712.html http://magus1.net/index4489.html http://magus1.net/index1042.html http://magus1.net/index4790.html http://magus1.net/index1191.html http://magus1.net/index4526.html http://magus1.net/index3668.html http://magus1.net/index1618.html http://magus1.net/index2908.html http://magus1.net/index1685.html http://magus1.net/index796.html http://magus1.net/index2922.html http://magus1.net/index491.html http://magus1.net/index4682.html http://magus1.net/index2131.html http://magus1.net/index2152.html http://magus1.net/index1959.html http://magus1.net/index3652.html http://magus1.net/index4444.html http://magus1.net/index1656.html http://magus1.net/index4253.html http://magus1.net/index1359.html http://magus1.net/index4319.html http://magus1.net/index3596.html http://magus1.net/index2312.html http://magus1.net/index288.html http://magus1.net/index2580.html http://magus1.net/index804.html http://magus1.net/index3978.html http://magus1.net/index1814.html http://magus1.net/index1830.html http://magus1.net/index4982.html http://magus1.net/index651.html http://magus1.net/index3791.html http://magus1.net/index2816.html http://magus1.net/index3066.html http://magus1.net/index37.html http://magus1.net/index3063.html http://magus1.net/index1444.html http://magus1.net/index4536.html http://magus1.net/index1446.html http://magus1.net/index920.html http://magus1.net/index283.html http://magus1.net/index3139.html http://magus1.net/index484.html http://magus1.net/index1695.html http://magus1.net/index4748.html http://magus1.net/index2144.html http://magus1.net/index3954.html http://magus1.net/index4155.html http://magus1.net/index4413.html http://magus1.net/index2241.html http://magus1.net/index317.html http://magus1.net/index893.html http://magus1.net/index4909.html http://magus1.net/index472.html http://magus1.net/index2171.html http://magus1.net/index49.html http://magus1.net/index802.html http://magus1.net/index3207.html http://magus1.net/index363.html http://magus1.net/index3602.html http://magus1.net/index3209.html http://magus1.net/index4646.html http://magus1.net/index1555.html http://magus1.net/index3301.html http://magus1.net/index3844.html http://magus1.net/index3009.html http://magus1.net/index1493.html http://magus1.net/index4892.html http://magus1.net/index3520.html http://magus1.net/index489.html http://magus1.net/index2148.html http://magus1.net/index3105.html http://magus1.net/index351.html http://magus1.net/index1641.html http://magus1.net/index3038.html http://magus1.net/index1644.html http://magus1.net/index3599.html http://magus1.net/index1142.html http://magus1.net/index3816.html http://magus1.net/index2849.html http://magus1.net/index4104.html http://magus1.net/index2801.html http://magus1.net/index1228.html http://magus1.net/index2341.html http://magus1.net/index453.html http://magus1.net/index668.html http://magus1.net/index4430.html http://magus1.net/index2653.html http://magus1.net/index2860.html http://magus1.net/index4403.html http://magus1.net/index3382.html http://magus1.net/index1342.html http://magus1.net/index3559.html http://magus1.net/index46.html http://magus1.net/index3253.html http://magus1.net/index128.html http://magus1.net/index3864.html http://magus1.net/index4218.html http://magus1.net/index3341.html http://magus1.net/index4529.html http://magus1.net/index4631.html http://magus1.net/index3927.html http://magus1.net/index3281.html http://magus1.net/index3367.html http://magus1.net/index1323.html http://magus1.net/index4710.html http://magus1.net/index4211.html http://magus1.net/index4482.html http://magus1.net/index174.html http://magus1.net/index4438.html http://magus1.net/index3909.html http://magus1.net/index3592.html http://magus1.net/index540.html http://magus1.net/index2483.html http://magus1.net/index11.html http://magus1.net/index4122.html http://magus1.net/index836.html http://magus1.net/index2043.html http://magus1.net/index615.html http://magus1.net/index979.html http://magus1.net/index4592.html http://magus1.net/index272.html http://magus1.net/index2458.html http://magus1.net/index3165.html http://magus1.net/index4026.html http://magus1.net/index4887.html http://magus1.net/index198.html http://magus1.net/index3429.html http://magus1.net/index2905.html http://magus1.net/index1550.html http://magus1.net/index1266.html http://magus1.net/index2159.html http://magus1.net/index1244.html http://magus1.net/index4231.html http://magus1.net/index3483.html http://magus1.net/index730.html http://magus1.net/index3256.html http://magus1.net/index4603.html http://magus1.net/index3116.html http://magus1.net/index4734.html http://magus1.net/index2082.html http://magus1.net/index4658.html http://magus1.net/index4997.html http://magus1.net/index1645.html http://magus1.net/index3342.html http://magus1.net/index4907.html http://magus1.net/index4919.html http://magus1.net/index3698.html http://magus1.net/index1324.html http://magus1.net/index3107.html http://magus1.net/index2734.html http://magus1.net/index1711.html http://magus1.net/index2596.html http://magus1.net/index4898.html http://magus1.net/index751.html http://magus1.net/index4967.html http://magus1.net/index4094.html http://magus1.net/index3673.html http://magus1.net/index4038.html http://magus1.net/index4810.html http://magus1.net/index3787.html http://magus1.net/index2527.html http://magus1.net/index683.html http://magus1.net/index2070.html http://magus1.net/index1330.html http://magus1.net/index3796.html http://magus1.net/index3580.html http://magus1.net/index2652.html http://magus1.net/index2226.html http://magus1.net/index1441.html http://magus1.net/index4719.html http://magus1.net/index2522.html http://magus1.net/index3716.html http://magus1.net/index4077.html http://magus1.net/index1495.html http://magus1.net/index3133.html http://magus1.net/index4450.html http://magus1.net/index1102.html http://magus1.net/index4513.html http://magus1.net/index146.html http://magus1.net/index955.html http://magus1.net/index1427.html http://magus1.net/index2669.html http://magus1.net/index4289.html http://magus1.net/index3896.html http://magus1.net/index349.html http://magus1.net/index156.html http://magus1.net/index4300.html http://magus1.net/index3687.html http://magus1.net/index3073.html http://magus1.net/index4341.html http://magus1.net/index4065.html http://magus1.net/index4118.html http://magus1.net/index2752.html http://magus1.net/index4885.html http://magus1.net/index665.html http://magus1.net/index886.html http://magus1.net/index1340.html http://magus1.net/index3435.html http://magus1.net/index1661.html http://magus1.net/index672.html http://magus1.net/index1777.html http://magus1.net/index1007.html http://magus1.net/index4085.html http://magus1.net/index391.html http://magus1.net/index476.html http://magus1.net/index3224.html http://magus1.net/index2651.html http://magus1.net/index4743.html http://magus1.net/index4265.html http://magus1.net/index4399.html http://magus1.net/index1223.html http://magus1.net/index412.html http://magus1.net/index1829.html http://magus1.net/index697.html http://magus1.net/index3092.html http://magus1.net/index4076.html http://magus1.net/index2092.html http://magus1.net/index1504.html http://magus1.net/index882.html http://magus1.net/index2698.html http://magus1.net/index64.html http://magus1.net/index2232.html http://magus1.net/index4872.html http://magus1.net/index2339.html http://magus1.net/index3370.html http://magus1.net/index159.html http://magus1.net/index4920.html http://magus1.net/index608.html http://magus1.net/index818.html http://magus1.net/index65.html http://magus1.net/index2285.html http://magus1.net/index1570.html http://magus1.net/index3739.html http://magus1.net/index625.html http://magus1.net/index3430.html http://magus1.net/index3813.html http://magus1.net/index939.html http://magus1.net/index320.html http://magus1.net/index1170.html http://magus1.net/index2555.html http://magus1.net/index743.html http://magus1.net/index1652.html http://magus1.net/index3678.html http://magus1.net/index2802.html http://magus1.net/index4165.html http://magus1.net/index1322.html http://magus1.net/index3309.html http://magus1.net/index3934.html http://magus1.net/index2770.html http://magus1.net/index3388.html http://magus1.net/index237.html http://magus1.net/index820.html http://magus1.net/index2077.html http://magus1.net/index950.html http://magus1.net/index1234.html http://magus1.net/index3308.html http://magus1.net/index3236.html http://magus1.net/index3028.html http://magus1.net/index1461.html http://magus1.net/index354.html http://magus1.net/index477.html http://magus1.net/index3675.html http://magus1.net/index2560.html http://magus1.net/index983.html http://magus1.net/index3781.html http://magus1.net/index1996.html http://magus1.net/index1566.html http://magus1.net/index1307.html http://magus1.net/index2510.html http://magus1.net/index3570.html http://magus1.net/index1320.html http://magus1.net/index4481.html http://magus1.net/index3637.html http://magus1.net/index3011.html http://magus1.net/index3604.html http://magus1.net/index2645.html http://magus1.net/index3906.html http://magus1.net/index1459.html http://magus1.net/index3128.html http://magus1.net/index1543.html http://magus1.net/index3287.html http://magus1.net/index3761.html http://magus1.net/index4639.html http://magus1.net/index3029.html http://magus1.net/index1106.html http://magus1.net/index3912.html http://magus1.net/index1537.html http://magus1.net/index2002.html http://magus1.net/index195.html http://magus1.net/index340.html http://magus1.net/index1013.html http://magus1.net/index1534.html http://magus1.net/index4310.html http://magus1.net/index2061.html http://magus1.net/index2125.html http://magus1.net/index3857.html http://magus1.net/index2462.html http://magus1.net/index2828.html http://magus1.net/index2355.html http://magus1.net/index2038.html http://magus1.net/index4066.html http://magus1.net/index4591.html http://magus1.net/index1665.html http://magus1.net/index105.html http://magus1.net/index3670.html http://magus1.net/index1765.html http://magus1.net/index1903.html http://magus1.net/index3957.html http://magus1.net/index3081.html http://magus1.net/map.b.html http://magus1.net/index4792.html http://magus1.net/index1068.html http://magus1.net/index805.html http://magus1.net/index2321.html http://magus1.net/index1676.html http://magus1.net/index2085.html http://magus1.net/index4436.html http://magus1.net/index2163.html http://magus1.net/index2964.html http://magus1.net/index4401.html http://magus1.net/index4947.html http://magus1.net/index3950.html http://magus1.net/index2420.html http://magus1.net/index3254.html http://magus1.net/index1984.html http://magus1.net/index26.html http://magus1.net/index1982.html http://magus1.net/index1917.html http://magus1.net/index3413.html http://magus1.net/index1902.html http://magus1.net/index188.html http://magus1.net/index2869.html http://magus1.net/index3250.html http://magus1.net/index3949.html http://magus1.net/index1292.html http://magus1.net/index1991.html http://magus1.net/index3486.html http://magus1.net/index2405.html http://magus1.net/index3733.html http://magus1.net/index1860.html http://magus1.net/index319.html http://magus1.net/index2172.html http://magus1.net/index4429.html http://magus1.net/index1762.html http://magus1.net/index3643.html http://magus1.net/index3362.html http://magus1.net/index3667.html http://magus1.net/index1156.html http://magus1.net/index4726.html http://magus1.net/index3806.html http://magus1.net/index3765.html http://magus1.net/index4146.html http://magus1.net/index2549.html http://magus1.net/index3623.html http://magus1.net/index401.html http://magus1.net/index1822.html http://magus1.net/index2472.html http://magus1.net/index2298.html http://magus1.net/index2397.html http://magus1.net/index1.html http://magus1.net/index4103.html http://magus1.net/index1931.html http://magus1.net/index3166.html http://magus1.net/index4835.html http://magus1.net/index3947.html http://magus1.net/index1341.html http://magus1.net/index2950.html http://magus1.net/index438.html http://magus1.net/index4285.html http://magus1.net/index490.html http://magus1.net/index3298.html http://magus1.net/index2677.html http://magus1.net/index1920.html http://magus1.net/index2997.html http://magus1.net/index4949.html http://magus1.net/index2807.html http://magus1.net/index4894.html http://magus1.net/index4853.html http://magus1.net/index1936.html http://magus1.net/index3051.html http://magus1.net/index1734.html http://magus1.net/index4877.html http://magus1.net/index3659.html http://magus1.net/index1137.html http://magus1.net/index679.html http://magus1.net/index297.html http://magus1.net/index3901.html http://magus1.net/index1336.html http://magus1.net/index1026.html http://magus1.net/index3982.html http://magus1.net/index3437.html http://magus1.net/index2821.html
I highly recommend it to those of you who are bold enough!:)

Posted by: magus8 at August 10, 2005 11:54 AM

thank

Posted by: Michael at October 2, 2006 03:30 AM

thanks a lot!

Posted by: praca at October 12, 2006 01:50 AM

This site is professional and to the point.

Posted by: BUses at December 4, 2006 04:59 PM

very nice......

Posted by: Thermage at January 18, 2007 09:11 AM

Great and excellent article ts realy helpful. Thanks again.
http://www.Klinik-Falkenried.de/hautverjuengung.htm

Greats,
Thermage

Posted by: Thermage Hamburg at February 8, 2007 04:43 PM

thanks a lot!

Posted by: pendrive at June 4, 2007 01:09 AM

thanks

Posted by: Giełda samochodowa at June 11, 2007 08:36 AM

This site is professional and to the point....

Posted by: Opisy at June 13, 2007 05:32 PM

thanks a lot!

Posted by: usb flashdrive at June 17, 2007 05:52 AM

Very interesting article....

Posted by: Wyniki na żywo at June 22, 2007 12:05 AM

Great work ! I really enjoyed browsing through this site. I will recommend it to my friends. Greetings

Posted by: Odżywki at June 29, 2007 03:48 AM

nice artilces

Posted by: kyle at July 1, 2007 12:32 PM

Thanks for surely interesting article. btw. I really enjoyed impute toing all of your posts. It’s interesting to get hold of ideas, and observations withdrawn someone else’s wise of view… makes you think more. I think these blog is really cogent for new comers and Excellent resource list.
It´s a almighty interesting Blog and simple answer of many questions.

Posted by: Tommy Delan at August 21, 2007 10:17 PM

great post thanks

Posted by: oyunkabini at September 13, 2007 11:45 AM

thanks....

Posted by: oyunkabini at September 13, 2007 11:47 AM

Great work ! I really enjoyed browsing through this site. I will recommend it to my friends. Greetings

Posted by: Darmowe gry at September 22, 2007 02:24 AM

Try CakePHP, it's better than Ruby.

Posted by: Big Dick's at October 5, 2007 02:35 PM

I used C++ as well and didn't know it allowed connotations; thx for the heads up.

Posted by: ventrilo hosting at April 22, 2008 11:29 AM

Thanks for the tutorial.

Posted by: Free Flash Games at May 16, 2008 01:27 PM

Thanks for the great post. I love reading your article.

Posted by: Free Online Games at May 16, 2008 01:29 PM

Thanks.

Posted by: Free Flash Games at May 16, 2008 01:41 PM

Great work ! I really enjoyed browsing through this site. I will recommend it to my friends

Posted by: Dress Up Games at May 16, 2008 06:44 PM

Thanks for the article. I enjoy reading them.

Posted by: Super Mario Games at May 16, 2008 06:49 PM

thanks

Posted by: kpli at May 29, 2008 07:15 AM

wow..very rare post here

Posted by: gambar hantu at May 29, 2008 08:34 PM

"Continuations" are called generators in Python.

Python introduced generator ("yield" statement) and generator expressions which are the lazy evaluation equivalent of list comprehensions.

Here's an example of generator expressions using native Python generator xrange :

>>> def even(*args):
return (x for x in xrange(*args) if x % 2 == 0)

>>> for x in even(1, 20):
print x,

2 4 6 8 10 12 14 16 18

In real word, consider filtering generator expressions with advanced custom filter. Neat and clean.

@Tiny Dick :
> "Try CakePHP, it's better than Ruby."

lol, CakePHP is just a weak fake RoR. If you can't cope with Ruby then continue to toy with PHP.

Posted by: Yng at June 4, 2008 12:40 AM
Post a comment






Remember personal info?