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?
#1 by murphee (http://jroller.com/page/murphee) on 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.
#2 by murphee on 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.
#3 by Geert Bevin on April 18, 2005 - 12:52 pm
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.
#4 by Dave on April 18, 2005 - 1:09 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.
#5 by Geert Bevin on April 18, 2005 - 1:16 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.
#6 by Geert Bevin on April 18, 2005 - 2:05 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
#7 by Cedric on April 18, 2005 - 2:41 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?
#8 by Geert Bevin on April 18, 2005 - 2:59 pm
I updated my blog post with a more detailed explanation.
#9 by Romain Guy on April 18, 2005 - 4:37 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 ^^
#10 by Patrick Linskey on April 18, 2005 - 4:54 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.
#11 by Howard Lovatt on April 18, 2005 - 7:21 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.
#12 by Brian McCallister on April 18, 2005 - 7:39 pm
Howard, check out Seaside (in Smalltalk) and tell me if they are not useful in that “OO language” or not =)
#13 by Viktor Szathmary on April 18, 2005 - 9:36 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.
#14 by Howard Lovatt on April 18, 2005 - 10:59 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.
#15 by Geert Bevin on April 18, 2005 - 11:29 pm
Howard, check out this URL: http://beta4.com/seaside2/tutorial.html
#16 by Howard Lovatt on April 19, 2005 - 12:17 am
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.
#17 by Geert Bevin on April 19, 2005 - 12:39 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.
#18 by Simon on April 19, 2005 - 1:46 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…
#19 by Sam Ruby on April 19, 2005 - 5:01 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.
#20 by Frank Bolander on April 19, 2005 - 8:53 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.
#21 by Sam Ruby on April 19, 2005 - 11:28 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.
#22 by Frank Bolander on April 19, 2005 - 12:48 pm
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.
#23 by IM on April 20, 2005 - 8:16 am
Blimey. Who pished on Frank’s cornflakes?
#24 by Don Box's Spoutlet on April 23, 2005 - 9:30 am
Continuing Continuations
#25 by public virtual MemoryStream on April 25, 2005 - 9:53 pm
C# Continuations useful? Hell yeah!
Last week, Sam Ruby posted a very interesting article on continuations for “people older than dirt” (a category which I, according to his definition, fall into). The topic became even more interesting when Don Box posted how you can use a very similar …
#26 by magus8 on August 10, 2005 - 11:54 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://magu
s1.
net/index4211.html http://mag
us1.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!:)
#27 by Michael on October 2, 2006 - 3:30 am
thank
#28 by praca on October 12, 2006 - 1:50 am
thanks a lot!
#29 by BUses on December 4, 2006 - 4:59 pm
This site is professional and to the point.
#30 by Thermage on January 18, 2007 - 9:11 am
very nice……
#31 by Thermage Hamburg on February 8, 2007 - 4:43 pm
Great and excellent article ts realy helpful. Thanks again.
http://www.Klinik-Falkenried.de/hautverjuengung.htm
Greats,
Thermage
#32 by pendrive on June 4, 2007 - 1:09 am
thanks a lot!
#33 by Giełda samochodowa on June 11, 2007 - 8:36 am
thanks
#34 by Opisy on June 13, 2007 - 5:32 pm
This site is professional and to the point….
#35 by usb flashdrive on June 17, 2007 - 5:52 am
thanks a lot!
#36 by Wyniki na żywo on June 22, 2007 - 12:05 am
Very interesting article….
#37 by Odżywki on June 29, 2007 - 3:48 am
Great work ! I really enjoyed browsing through this site. I will recommend it to my friends. Greetings
#38 by kyle on July 1, 2007 - 12:32 pm
nice artilces
#39 by Tommy Delan on August 21, 2007 - 10:17 pm
Thanks for surely interesting article. btw. I really enjoyed impute toing all of your posts. It
#40 by oyunkabini on September 13, 2007 - 11:45 am
great post thanks
#41 by oyunkabini on September 13, 2007 - 11:47 am
thanks….
#42 by Darmowe gry on September 22, 2007 - 2:24 am
Great work ! I really enjoyed browsing through this site. I will recommend it to my friends. Greetings
#43 by Big Dick's on October 5, 2007 - 2:35 pm
Try CakePHP, it’s better than Ruby.
#44 by ventrilo hosting on April 22, 2008 - 11:29 am
I used C++ as well and didn’t know it allowed connotations; thx for the heads up.
#45 by Free Flash Games on May 16, 2008 - 1:27 pm
Thanks for the tutorial.
#46 by Free Online Games on May 16, 2008 - 1:29 pm
Thanks for the great post. I love reading your article.
#47 by Free Flash Games on May 16, 2008 - 1:41 pm
Thanks.
#48 by Dress Up Games on May 16, 2008 - 6:44 pm
Great work ! I really enjoyed browsing through this site. I will recommend it to my friends
#49 by Super Mario Games on May 16, 2008 - 6:49 pm
Thanks for the article. I enjoy reading them.
#50 by kpli on May 29, 2008 - 7:15 am
thanks
#51 by gambar hantu on May 29, 2008 - 8:34 pm
wow..very rare post here
#52 by Yng on June 4, 2008 - 12:40 am
“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.