[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: The subsetting has begun
I think we are going off-topic for the list. > > Throwing it back, so to speak - cool! > > > > <snip good stuff/> > > > > Thanks for taking the time to write such a detailed reply! > > Wierd languages are my hobby ;-) Would be mine too, if I had a C/S background. Ever heard of BETA? http://www.mjolner.com . Pretty much dead by now, but interesting. > > The question is: at what cost does on get efficient exception handling? > > Are continuation languages slower and/or more complex to implement? > > The main cost is that you can't use a stack, it has to be a linked list > instead, with garbage collection. Looks like you always pay for what you get. > Well C kind of had a limited form of continuations in setjmp / longjmp... > just you could mess the stack up with them. You could only ever jump *up* the > stack, never down, so you could use them to escape to an error handler but > they couldn't handle such continuation tricks as nondeterminstic algorithms. Is that legal in C++ too? Never used it - not being a C/C++ specialist. > Nondeterministic algorithms, I hear you ask? Well... > > Imagine a function like 'square root'. Mathematicall, every number has two > square roots; 2*2 = 4, (-2)*(-2)=4, so sqrt(4) = 2 and -2. > > Needless to say, you can't really express that easily in software. You could > have sqrt return a list of two numbers, but that's missing the point in a way. > > What you could do, in C for example, is to have the sqrt function call fork() > and return a different number in each fork. If this were part of an equation > solver, you would have to try both possible return values every time you got > to sqrt() or a similar function; some branches would return no solutions and > thus would give up, others would yield results. > > But doing it with lots of forks can consume an exponentially growing number > of OS resources. What you can do instead is to, every time you encounter a > sqrt(), preserve a 'retry continuation' in a global list that, if invoked, > will restart execution from the sqrt but return the negative root. Having > saved that continuation, return the positive root. > > Then you can define the 'abort' function (called when a line of enquiry > fails) to pop the top off of the list of retry continuations and invoke it. > > When the computation returns with an actual value, if there are still untried > retry continuations, then there may be more solutions available, so you can > output the solution you have found and try another retry. > > In a way, you are modelling the many worlds interpretation of quantum > mechanics... I can see that this make it simpler to iterate over the set of solutions for your problem. But that may depend on the problem. In other cases a simple list of (complex number) solutions may be better. You could probably model this also with classes that have an interator over a result set, preserving state of which result was last used. > Don't get me started on how different programming languages model time! C has > time implicitly handled by an advancing instruction pointer and a mutable > world-state, whereas Concurrent Clean programs model time by having a World > object and methods such as 'sleep' that accepts a World and a number of > seconds, and returns a World like the one passed in except that many seconds > have passed... Reminds me of Simula. Back when I was studying Physics (which I never practised professionally), I used to spend some time in the library reading through C/S books and magazines, since somehow that fascinated me. So, one day I came across a book about Simula, and this was actually my first real intro into a programming language (except for a basic Fortran course). Karl
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|