Now, is this something people would consider to be NOT pure end-to-end IP?
That's correct, this is NOT pure end-to-end, and no, email is NOT a valid exception. What you're doing is preventing your customers from directly using mail servers other than your own. Regardless of your intentions, this could just as easily be viewed as a monopolistic act, and when it's done by large companies like AOL, becomes just that.
I've recently had this done to me by Earthlink. I used to use my own mail server colocated at a hosting site to send outbound email. In the last few months, Earthlink, who I use as my local ISP, began blocking port 25, which means I can no longer access my own mail server to send email. I consider this unacceptable.
Others replies in this article have mentioned other services that they can't use with their provider, for example VNC. I had to abandon IBM Global Network when they started using a proxy which prohibited me from using local names for machines on a remote network, i.e. it wouldn't allow web requests to remote machines defined in my hosts file, since the "transparent" IBM proxy didn't recognize the machine name in the HTTP GET packet, even though my machine was attempting to send the request directly to the correct IP address. This prevented me from running intranet applications remotely.
I think there's a real risk is that the Internet will slowly devolve into a system which only allows communications on certain predefined ports, like 80, using predefined protocols, like HTTP. Already, we see systems that go to great lengths to package their communications into HTTP form in order to bypass firewalls and proxies. This will just create a stupid arms race in which people who want to abuse the network just get more creative about how they do that, while people who have legitimate uses will find the functionality they have available continually eroded.
While it might be possible to pay more money to get the services you want, this has the potential to significantly impede development of future systems if not everyone has access to the same features. After all, I fervently hope that HTTP 1.1 is not the last word in communications protocols - but how will the next revolutionary replacement be developed if the inventors aren't allowed to send anything other than approved packets across the network to approved ports?
...the retirement of Ken Thompson reminds us of how recently Unix was created. Unix is an OS that most/. readers take for granted, and I suspect many would agree that it feels as though it's always been there - for most readers, it has.
Ken's retirement is indicative of the amazing progress that we've made in the last 30 years. If you look at what's been built on his foundation in that time, it's rather mind-boggling. Ken's invention became a crucial part of the foundation for a global Internet that has had far-reaching effects on human society worldwide.
Certainly, a major milestone in the life of one of the founders of the technology which we all use heavily, is an event worthy of note.
when there are other, more immediate problems right here that need to be dealt with?
This is a fallacy. You're simply imposing your own value system on someone else.
What is it about so many scientists that drives them to absurd interests
Again, Levin's interest is absurd according to you and others like you. Luckily, not everyone thinks the same way.
Life on Mars is just like cold fusion - a great idea that will never be proven.
What is your basis for saying that? It's certainly feasible that a series of well-controlled experiments could settle the issue quite soundly. It sounds to me as though you're saying "we shouldn't try to do things that are difficult."
Hmm, I have to confess being unaware of this, but that sounds quite Godel-like, and therefore, possibly quite "ordinary": a formal system, lambda, which is internally consistent but contains statements which cannot be proved within the system, or in this case, when mapped into an alternate system.
If I understand Gregory Chaitin's interpretation of this sort of thing correctly, he might say that this is simply a case of an expression that is "randomly" true, i.e. true for no particular reason, thus unprovable, having no meaning, but nevertheless being fundamental to the existence of the formalism to which it belongs. In that sense, its usefulness in the absence of meaning itself has meaning, or at least an explanation, so I can still sleep easy tonight!;^)
"yuppies on their ten-speeds"? What, is this movie set in the '70s or something? Upright road bikes these days have anywhere from 14 to 18 gear ratios, and mountain bikes even more.
Bottom line, hippies and Hell's Angels weren't economically productive. They were picturesque though. Anyway, I gotta go put on some nice stretchy lycra, I have to go out for an espresso machiatto now...
when my account was new, and i metamodded, i got karma points for metamodding, but there are a limited number of points to be had this way, as others have mentioned.
i'm not sure that you ever get points for being metamodded by someone else, though.
A bigger justification is that arguments that depend upon the identity of their author are inherently weak, and that people who don't judge ideas on their own merits shouldn't waste their time on reading.
That's inherently weak itself. I don't think that arguments should necessarily be evaluated depending on the identity of the author, although being able to identify authors can be very helpful contextually. In fact, your argument falls down in the very area I'm talking about: when reading an AC's message, one has to rely on cues other than identity to tell whether the author is likely to be serious or just trolling/flamebaiting.
Besides, in general, dialogs with ACs are unrewarding - it's difficult for ACs to tell when their messages have been replied to. I don't usually reply to ACs, and I see others advocate not doing so. Unless you're a Chinese mole working deep in the NSA, if you want anonymity just get yourself an anonymous, free web email account and create a Slashdot login called "ParanoidElf" or something.
We need P and EM and UL/OL/LI to make ourselves fully understood without resorting to pointlessly obscure textual conventions *like this*.
We meaning trolls, or we meaning ACs?;)
I sometimes use *this* even in HTML messages, I don't think it's so bad.
Having zero barriers to entry results in a not-insignificant class of messages which don't add anything meaningful, and in fact actively attempt to disrupt things. I've never been in favor of eliminating Anonymous Cowards, but I think this minor restriction would be an improvement, at little cost.
This subscription doesn't offer what Visual C++ tried. It doesn't promise any automatic upgrades. It's simply a way to replace a higher one-time cost with a lower recurring cost. Presumably, when a new version does become available, there will be an option to upgrade and continue paying a (higher?) subscription fee.
Chalst gave a good reply about Kaplan's rather obvious bias, which was apparent both in his actual ruling and in his statements to the press.
Is it really his place to overturn a law based on whether or not it is constitutional ? Indeed, did the defence prepare an argument to that effect ?
Yes, the defense did argue that DeCSS was protected speech, and that the DMCA, as applied to DeCSS, violated the First Amendment. It was well within Kaplan's power to rule that the DMCA could not be applied to DeCSS because it violated the defendants' constitutional rights. That would not overturn the law as a whole. This is exactly the kind of thing that other judges have done in cases like the ones I referred to, regarding both the CDA, and encryption export regulations. In the case of the encryption regs, federal law was subsequently changed to allow publishing of encryption source code, from what I understand.
What Kaplan did was take the conservative, pro-industry approach of granting a temporary injuction, regardless of any constitutional rights of the defendants, based largely on the monetary damages that could allegedly be suffered by the plaintiffs due to DeCSS. Given the fact that Kaplan has previously represented Warner Brothers on several occasions, and that his parter apparently helped design the DVD antitrust strategy while Kaplan was on staff in the same department, Kaplan certainly falls short of the ethical standard that a judge should avoid even the appearance of impropriety. Even his comments about the defendants indicate clear bias, whatever the basis for that bias.
Still, I went too far in calling Kaplan stupid and/or corrupt. However, I strongly disagree with his conclusions, and I question his objectivity in this matter.
Just use VMWare and run the code in a protected virtual machine. That also solves the Windows problem: you can run a real Windows session on a Linux box.
"Smart" is relative. By some measures, anyone who passes law school and the bar exams is "smart". But compared to many other thinkers in our society, Kaplan is mediocre at best, and as much admits it when he extrapolates from his own
lack of competence in these matters, to arrive at the preposterous conclusion that all judges are as ill-suited as he to rule on such cases.
It seems clear to me, contrary to Kaplan's assertions, that his ruling will not be upheld, unless higher courts radically change their attitudes to free speech.
The first amendment right to free speech has already been applied to crypto source code, in a case which denied the federal government the ability to restrict speech in the form of computer code. The protection applied to computer code as free expression has been found sufficient to override laws regarding national security. Surely the national interest is more important than specific commercial interests, such as those of the MPAA and its members, in which case overriding the MPAA's interest in this case should have been a non-issue.
Kaplan also referenced the Pacifica ruling which restricts content transmitted over public airwaves; but again, communications on the Internet have already been held to the highest standard of freedom of expression by other circuit appeal courts, including the panel which declawed the CDA, so Kaplan's choice of precedent is highly questionable. By Kaplan's argument, swearing on the Internet could conceivably be banned, and according to him, to think otherwise would be an "absolutist view of the First Amendment"!!!
So Kaplan is simply picking and choosing inappropriate precedents (e.g. re public airwaves) to bolster his pro-industry prejudice, and ignoring more recent and relevant precedent (albeit in different circuits) which contradict his position.
Perhaps the way in which Kaplan could be said to be "smart" is that he didn't feel comfortable singlehandedly dealing with the conflict between the DMCA and the Constitution, and so chose to simply uphold the most recent law, ignoring the fundamental law upon which the United States is founded; or one could say he is smart in that he has protected a possible future consulting revenue stream from his former employer, Time Warner, by not alienating them with a ruling counter to their interests.
But why CmdrTaco should think that is "smart" is beyond me. Kaplan is either stupid or corrupt, or both.
...can be pretty darn spectactular. Or so I've heard. I've seen (and been responsible for) my fair share of crashes, and they can be pretty impressive on their own. The momentum in a 4ft diameter set of wooden rotor blades revolving at 2000rpm is quite serious. And unlike those boring Battlebots that are all steel, industrial strength and semi-indestructible, stuff that's designed to fly has to be light and therefore not too strong. A Heli-Battlebot battle would be short but impressive!
I propose a fix to the karma system so that only people with a karma level above some set level (like maybe even just 5 points) can post links (or HTML at all to keep it simple).
This is a great idea. After all, the big justification for AC's is to allow people who truly need to be anonymous to post. This doesn't meaningfully restrict that, but it would cut down significantly on a certain category of mindless trolling.
"When we stand in the dark and look at a star a hundred light years away, not only have the retarded light waves from the star been traveling for a hundred years to reach our eyes, but the advanced waves generated by absorption processes within our eyes have reached a hundred years into the past, completing the transaction that permitted the star to shine in our direction."
In my other response to you, I forgot to mention that there's a potentially important difference between tail recursion and iteration: ideally, tail recursion actually simply allows optimal use of the stack, and doesn't necessarily involve recursion (or iteration) at all. It's just that the context in which it's most discussed is that of recursion & iteration. However, the tail call at the end of a function does not need to recursively call the current function: it could call something else, and the result would simply be that the stack depth is not increased and when the called function returns, it returns directly to the original caller rather than popping through a stack of intermediate calls. Think of it like a GOTO written in a function calling style with parameters.
Tail recursion and iteration are equivalent, computationally, but the difference between the two can be a little more than syntactical. I'd suggest reading this page, which talks about tail recursion and cases in which recursion is preferable. A relevant quote:
So why would you want to write a program recursively when you can write it
using a loop? Well, the main answer is that recursion is a more general
mechanism, so it can express some solutions simply that are awkward to write as a loop. Some programmers also feel that recursion is a stylistically preferable way to write loops because it avoids assigning variables.
Here's a quote from the link you referenced, under point 2.1:
In essence, every single line of code has a continuation that represents the entire future execution of the program.
The last expression in my third function, factfn():
factfn( n - 1, function ( p ) { return fn( n * p ) } );
...is exactly that. This expression represents the entire future execution of the program. The only qualification is that to evaluate that expression, a lot of stack activity of various kinds is required, but that would be true of ordinary Lisp, too, as opposed to a tail-recursive implementation.
Let us agree to write all programs so that whenever a subexpression is being evaluated, a procedure representing the current context is always applied to the answer produced by that subexpression. This one-argument procedure is called a continuation. Whenever any function in the program is executed, it is passed the continuation parameter representing the current context. Deep-recursive calls can be made tail recursive by augmenting the current continuation parameter with any actions required by the context of the current call.
The example on that page is the canonical example of factorial in cps style in Lisp-like languages:
This program maps syntactically to my Javascript example, exactly: their n is my n, their k is my fn, and their v is my p.
To further demonstrate the apparent "continuation-ness" of the Javascript implementation, if you change the line in factfn() which reads "return fn(1)" to simply "return fn", factfn() will now return an unevaluated function to its caller. That function encapsulates the factorial of the value of n specified by the caller. You can then evaluate it, after the factfn() function has returned. The calling code would then look like this:
aFacFn = factfn( 5, function (x) { return x; } );
document.write( aFacFn( 1 ) );
When aFacFn(1) executes, it returns 120. It happens to arrive at this result by recursion. Nevertheless, the values of n which it uses internally come from function contexts (what that Python page is referring to as "frames") which are not (or no longer) on the traditional call stack. Since functions are first-class objects in Javascript, it pretty much has to support the concept of a frame detached from the call stack, and it does.
Having defended my position, I will say that no-one should seriously try to learn about these things using Javascript, or Python for that matter. When learning, it's much easier to work with these concepts in the context in which they're most effective, i.e. a true functional language. I picked Javascript for these examples because of its 1st-class function support and the fact that just about anyone reading this can run the code in their browser.
<SCRIPT>
// See explanation at end.
// This code works and will run in a web browser -
// just save as.html and load in your browser.
// Will work in Mozilla or IE.
// write the function name, value of n and result to the browser window
function printFacVal( fname, n, x )
{
document.write( fname + "(" + n + ") = " + x + "<P>" );
}
// Plain ol' recursive implementation of factorial
function fact( n )
{
if ( n == 0 )
return 1;
else
return n * fact( n - 1 );
}
// Version which supports tail recursion: final value is
// known when recurse bottom is reached, so stack can be
// optimized away in a language which supports this.
// See http://www.cs.utexas.edu/users/novak/cs30770.html -
// or for fun, http://info.astrian.net/jargon/terms/t/tail_recurs ion.html
function factail( n, total )
{
if ( n == 0 )
return total;
else
return factail( n - 1, n * total );
}
/*
factfn()
Version which builds a function to calculate factorial(n)
This only really makes sense in a functional language.
Although syntactically it can be mapped directly onto its
functional language equivalent, and although it does
actually work in Javascript, CS students around the
country are recoiling in amazement tinged with horror
as they read this.
*/
function factfn( n, fn )
{
if ( n == 0 )
return fn( 1 );
else
return factfn( n - 1, function ( p ) { return fn( n * p ) } );
}
/*
factfn() would be rather hard to implement in a language like Pascal or C,
except if you were using one of those languages to build a functional language
(in which case, that would be easy!;)
As factfn() descends through its recursive calls, the anonymous function which
is passed as the second parameter becomes a function built specifically to
calculate the factorial of the specified n, i.e. the final value of fn(1)
equals the factorial of n.
However, since current implementations of Javascript don't support tail
recursion, factfn() relies on a stack to achieve its recursion, and is
thus bounded by stack size in what it can compute (actually, in this case,
the factorial calculation is limited numerically: factorial(170) or so
will overflow a typical Javascript implementation, long before the stack
fills up.) A tail-recursion implementation doesn't need a stack to recurse,
thus is not limited by stack depth.
Another difference between this and a tail-recursive implementation is that
when fn(1) is finally evaluated, in the Javascript implementation, it will
call itself recursively, again using the stack. At each level, the value
of n is taken from the function's context at the appropriate level (which
may be implemented on the stack).
A fully tail-recursive cps implementation would do all this without the
need for a stack. The final evaluation of fn(1) would simply evaluate the
final result of n * (n-1) * (n-2)... and get the right answer.
I wonder however, why it is so important to a bunch of technocrats such as ourselves that the common man be able to enact these transactions unconsciously.
The answer to this is obvious: there is a class of person ("common" or otherwise) for whom acquisition of material wealth is the overriding goal of the game of existence. The only way to acquire large amounts of such wealth is to obtain it from large numbers of the "common man", i.e. "consumers". In order to do this most efficiently, it is necessary that consumers be separated from their money by as few clicks of the mouse as possible.
Based on this analysis, of course, it is clear that Amazon.com with its one-click patent can be said to have won this game. Nevertheless, the game continues to be played vigorously, since acquisition of wealth appears to be one of the most motivating games ever conceived.
BTW, are paragraph breaks considered a po-mo no-no?
You're right, that homosexuality take comes straight from Tarantino's "Sleep With Me" (see this transcript). As it says on the same page, of Top Gun, "It's also the most unintentionally gay movie ever made by a big studio, so homoerotic it's like some kind of camp joke." You can kinda see their point - who knows, perhaps a scriptwriter was having some fun. Still, I seriously doubt Tarantino intended that to be anything more than poking fun. BTW, the actual (non-Tarantino) line from the movie was "You can be my wingman anytime", I think.
But there's a big gap between warmed-over Tarantino satire being regurgitated as pop feminist criticism, and poking holes in a plot. The former is pretty ridiculous, especially in the context of a blockbuster action/romance movie. The latter, even a child does.
I had to look it up, not having seen BG for a very long time, but you have to admit, if the Silons would just get on with it and destroy all these pesky humans, at least the flow of bad movies and bad criticism would stop!
That's correct, this is NOT pure end-to-end, and no, email is NOT a valid exception. What you're doing is preventing your customers from directly using mail servers other than your own. Regardless of your intentions, this could just as easily be viewed as a monopolistic act, and when it's done by large companies like AOL, becomes just that.
I've recently had this done to me by Earthlink. I used to use my own mail server colocated at a hosting site to send outbound email. In the last few months, Earthlink, who I use as my local ISP, began blocking port 25, which means I can no longer access my own mail server to send email. I consider this unacceptable.
Others replies in this article have mentioned other services that they can't use with their provider, for example VNC. I had to abandon IBM Global Network when they started using a proxy which prohibited me from using local names for machines on a remote network, i.e. it wouldn't allow web requests to remote machines defined in my hosts file, since the "transparent" IBM proxy didn't recognize the machine name in the HTTP GET packet, even though my machine was attempting to send the request directly to the correct IP address. This prevented me from running intranet applications remotely.
I think there's a real risk is that the Internet will slowly devolve into a system which only allows communications on certain predefined ports, like 80, using predefined protocols, like HTTP. Already, we see systems that go to great lengths to package their communications into HTTP form in order to bypass firewalls and proxies. This will just create a stupid arms race in which people who want to abuse the network just get more creative about how they do that, while people who have legitimate uses will find the functionality they have available continually eroded.
While it might be possible to pay more money to get the services you want, this has the potential to significantly impede development of future systems if not everyone has access to the same features. After all, I fervently hope that HTTP 1.1 is not the last word in communications protocols - but how will the next revolutionary replacement be developed if the inventors aren't allowed to send anything other than approved packets across the network to approved ports?
Ken's retirement is indicative of the amazing progress that we've made in the last 30 years. If you look at what's been built on his foundation in that time, it's rather mind-boggling. Ken's invention became a crucial part of the foundation for a global Internet that has had far-reaching effects on human society worldwide.
Certainly, a major milestone in the life of one of the founders of the technology which we all use heavily, is an event worthy of note.
This is a fallacy. You're simply imposing your own value system on someone else.
What is it about so many scientists that drives them to absurd interests
Again, Levin's interest is absurd according to you and others like you. Luckily, not everyone thinks the same way.
Life on Mars is just like cold fusion - a great idea that will never be proven.
What is your basis for saying that? It's certainly feasible that a series of well-controlled experiments could settle the issue quite soundly. It sounds to me as though you're saying "we shouldn't try to do things that are difficult."
If I understand Gregory Chaitin's interpretation of this sort of thing correctly, he might say that this is simply a case of an expression that is "randomly" true, i.e. true for no particular reason, thus unprovable, having no meaning, but nevertheless being fundamental to the existence of the formalism to which it belongs. In that sense, its usefulness in the absence of meaning itself has meaning, or at least an explanation, so I can still sleep easy tonight! ;^)
Perhaps you already know this, but I can't sit idly by while you cast aspersions on a most interesting function, the fixed-point combinator:
It returns the fixed point of any function expressible in lambda calculus. If that doesn't have an important logical meaning, I don't know what does!
...your boss would, of course, have a pointy head!
The observant reader may speculate that I, the writer of this, may have the same hangup. Could be!
Yes, but you don't inflict yourself on us to the same degree...
Bottom line, hippies and Hell's Angels weren't economically productive. They were picturesque though. Anyway, I gotta go put on some nice stretchy lycra, I have to go out for an espresso machiatto now...
i'm not sure that you ever get points for being metamodded by someone else, though.
That's inherently weak itself. I don't think that arguments should necessarily be evaluated depending on the identity of the author, although being able to identify authors can be very helpful contextually. In fact, your argument falls down in the very area I'm talking about: when reading an AC's message, one has to rely on cues other than identity to tell whether the author is likely to be serious or just trolling/flamebaiting.
Besides, in general, dialogs with ACs are unrewarding - it's difficult for ACs to tell when their messages have been replied to. I don't usually reply to ACs, and I see others advocate not doing so. Unless you're a Chinese mole working deep in the NSA, if you want anonymity just get yourself an anonymous, free web email account and create a Slashdot login called "ParanoidElf" or something.
We need P and EM and UL/OL/LI to make ourselves fully understood without resorting to pointlessly obscure textual conventions *like this*.
We meaning trolls, or we meaning ACs? ;)
I sometimes use *this* even in HTML messages, I don't think it's so bad.
Having zero barriers to entry results in a not-insignificant class of messages which don't add anything meaningful, and in fact actively attempt to disrupt things. I've never been in favor of eliminating Anonymous Cowards, but I think this minor restriction would be an improvement, at little cost.
This subscription doesn't offer what Visual C++ tried. It doesn't promise any automatic upgrades. It's simply a way to replace a higher one-time cost with a lower recurring cost. Presumably, when a new version does become available, there will be an option to upgrade and continue paying a (higher?) subscription fee.
You are!
But I'm enough of an idealist that I consider a judge who fits the definition you quoted, to be unfit for office.
Is it really his place to overturn a law based on whether or not it is constitutional ? Indeed, did the defence prepare an argument to that effect ?
Yes, the defense did argue that DeCSS was protected speech, and that the DMCA, as applied to DeCSS, violated the First Amendment. It was well within Kaplan's power to rule that the DMCA could not be applied to DeCSS because it violated the defendants' constitutional rights. That would not overturn the law as a whole. This is exactly the kind of thing that other judges have done in cases like the ones I referred to, regarding both the CDA, and encryption export regulations. In the case of the encryption regs, federal law was subsequently changed to allow publishing of encryption source code, from what I understand.
What Kaplan did was take the conservative, pro-industry approach of granting a temporary injuction, regardless of any constitutional rights of the defendants, based largely on the monetary damages that could allegedly be suffered by the plaintiffs due to DeCSS. Given the fact that Kaplan has previously represented Warner Brothers on several occasions, and that his parter apparently helped design the DVD antitrust strategy while Kaplan was on staff in the same department, Kaplan certainly falls short of the ethical standard that a judge should avoid even the appearance of impropriety. Even his comments about the defendants indicate clear bias, whatever the basis for that bias.
Still, I went too far in calling Kaplan stupid and/or corrupt. However, I strongly disagree with his conclusions, and I question his objectivity in this matter.
Just use VMWare and run the code in a protected virtual machine. That also solves the Windows problem: you can run a real Windows session on a Linux box.
It seems clear to me, contrary to Kaplan's assertions, that his ruling will not be upheld, unless higher courts radically change their attitudes to free speech.
The first amendment right to free speech has already been applied to crypto source code, in a case which denied the federal government the ability to restrict speech in the form of computer code. The protection applied to computer code as free expression has been found sufficient to override laws regarding national security. Surely the national interest is more important than specific commercial interests, such as those of the MPAA and its members, in which case overriding the MPAA's interest in this case should have been a non-issue.
Kaplan also referenced the Pacifica ruling which restricts content transmitted over public airwaves; but again, communications on the Internet have already been held to the highest standard of freedom of expression by other circuit appeal courts, including the panel which declawed the CDA, so Kaplan's choice of precedent is highly questionable. By Kaplan's argument, swearing on the Internet could conceivably be banned, and according to him, to think otherwise would be an "absolutist view of the First Amendment"!!!
So Kaplan is simply picking and choosing inappropriate precedents (e.g. re public airwaves) to bolster his pro-industry prejudice, and ignoring more recent and relevant precedent (albeit in different circuits) which contradict his position.
Perhaps the way in which Kaplan could be said to be "smart" is that he didn't feel comfortable singlehandedly dealing with the conflict between the DMCA and the Constitution, and so chose to simply uphold the most recent law, ignoring the fundamental law upon which the United States is founded; or one could say he is smart in that he has protected a possible future consulting revenue stream from his former employer, Time Warner, by not alienating them with a ruling counter to their interests.
But why CmdrTaco should think that is "smart" is beyond me. Kaplan is either stupid or corrupt, or both.
...can be pretty darn spectactular. Or so I've heard. I've seen (and been responsible for) my fair share of crashes, and they can be pretty impressive on their own. The momentum in a 4ft diameter set of wooden rotor blades revolving at 2000rpm is quite serious. And unlike those boring Battlebots that are all steel, industrial strength and semi-indestructible, stuff that's designed to fly has to be light and therefore not too strong. A Heli-Battlebot battle would be short but impressive!
...they're called "sunglasses".
This is a great idea. After all, the big justification for AC's is to allow people who truly need to be anonymous to post. This doesn't meaningfully restrict that, but it would cut down significantly on a certain category of mindless trolling.
> weirdness which has had so many physicists scratching their heads for years.
Here's an example of how John Cramer's Transactional Interpretation eliminates weirdness:
"When we stand in the dark and look at a star a hundred light years away, not only have the retarded light waves from the star been traveling for a hundred years to reach our eyes, but the advanced waves generated by absorption processes within our eyes have reached a hundred years into the past, completing the transaction that permitted the star to shine in our direction."
Oh yeah, that's perfectly non-weird, alright!
In my other response to you, I forgot to mention that there's a potentially important difference between tail recursion and iteration: ideally, tail recursion actually simply allows optimal use of the stack, and doesn't necessarily involve recursion (or iteration) at all. It's just that the context in which it's most discussed is that of recursion & iteration. However, the tail call at the end of a function does not need to recursively call the current function: it could call something else, and the result would simply be that the stack depth is not increased and when the called function returns, it returns directly to the original caller rather than popping through a stack of intermediate calls. Think of it like a GOTO written in a function calling style with parameters.
The last expression in my third function, factfn():
The explanation h ere is more explicit, IMO:
The example on that page is the canonical example of factorial in cps style in Lisp-like languages:
(define fact-k
(lambda (n k)
(if (zero? n) (k 1)
(fact-k (1- n) (lambda (v) (k (* n v)))))))
This program maps syntactically to my Javascript example, exactly: their n is my n, their k is my fn, and their v is my p.
To further demonstrate the apparent "continuation-ness" of the Javascript implementation, if you change the line in factfn() which reads "return fn(1)" to simply "return fn", factfn() will now return an unevaluated function to its caller. That function encapsulates the factorial of the value of n specified by the caller. You can then evaluate it, after the factfn() function has returned. The calling code would then look like this:
aFacFn = factfn( 5, function (x) { return x; } );
document.write( aFacFn( 1 ) );
When aFacFn(1) executes, it returns 120. It happens to arrive at this result by recursion. Nevertheless, the values of n which it uses internally come from function contexts (what that Python page is referring to as "frames") which are not (or no longer) on the traditional call stack. Since functions are first-class objects in Javascript, it pretty much has to support the concept of a frame detached from the call stack, and it does.
Having defended my position, I will say that no-one should seriously try to learn about these things using Javascript, or Python for that matter. When learning, it's much easier to work with these concepts in the context in which they're most effective, i.e. a true functional language. I picked Javascript for these examples because of its 1st-class function support and the fact that just about anyone reading this can run the code in their browser.
<SCRIPT> .html and load in your browser.
s ion.html
;)
// See explanation at end.
// This code works and will run in a web browser -
// just save as
// Will work in Mozilla or IE.
// sample calls
printFacVal( "fact", 12, fact(12) );
printFacVal( "factail", 12, factail(12, 1) );
printFacVal( "factfn", 12, factfn(12, function (x) { return x; } ) );
// write the function name, value of n and result to the browser window
function printFacVal( fname, n, x )
{
document.write( fname + "(" + n + ") = " + x + "<P>" );
}
// Plain ol' recursive implementation of factorial
function fact( n )
{
if ( n == 0 )
return 1;
else
return n * fact( n - 1 );
}
// Version which supports tail recursion: final value is
// known when recurse bottom is reached, so stack can be
// optimized away in a language which supports this.
// See http://www.cs.utexas.edu/users/novak/cs30770.html -
// or for fun, http://info.astrian.net/jargon/terms/t/tail_recur
function factail( n, total )
{
if ( n == 0 )
return total;
else
return factail( n - 1, n * total );
}
/*
factfn()
Version which builds a function to calculate factorial(n)
This only really makes sense in a functional language.
Although syntactically it can be mapped directly onto its
functional language equivalent, and although it does
actually work in Javascript, CS students around the
country are recoiling in amazement tinged with horror
as they read this.
*/
function factfn( n, fn )
{
if ( n == 0 )
return fn( 1 );
else
return factfn( n - 1, function ( p ) { return fn( n * p ) } );
}
/*
factfn() would be rather hard to implement in a language like Pascal or C,
except if you were using one of those languages to build a functional language
(in which case, that would be easy!
As factfn() descends through its recursive calls, the anonymous function which
is passed as the second parameter becomes a function built specifically to
calculate the factorial of the specified n, i.e. the final value of fn(1)
equals the factorial of n.
However, since current implementations of Javascript don't support tail
recursion, factfn() relies on a stack to achieve its recursion, and is
thus bounded by stack size in what it can compute (actually, in this case,
the factorial calculation is limited numerically: factorial(170) or so
will overflow a typical Javascript implementation, long before the stack
fills up.) A tail-recursion implementation doesn't need a stack to recurse,
thus is not limited by stack depth.
Another difference between this and a tail-recursive implementation is that
when fn(1) is finally evaluated, in the Javascript implementation, it will
call itself recursively, again using the stack. At each level, the value
of n is taken from the function's context at the appropriate level (which
may be implemented on the stack).
A fully tail-recursive cps implementation would do all this without the
need for a stack. The final evaluation of fn(1) would simply evaluate the
final result of n * (n-1) * (n-2)... and get the right answer.
*/
</SCRIPT>
The answer to this is obvious: there is a class of person ("common" or otherwise) for whom acquisition of material wealth is the overriding goal of the game of existence. The only way to acquire large amounts of such wealth is to obtain it from large numbers of the "common man", i.e. "consumers". In order to do this most efficiently, it is necessary that consumers be separated from their money by as few clicks of the mouse as possible.
Based on this analysis, of course, it is clear that Amazon.com with its one-click patent can be said to have won this game. Nevertheless, the game continues to be played vigorously, since acquisition of wealth appears to be one of the most motivating games ever conceived.
BTW, are paragraph breaks considered a po-mo no-no?
But there's a big gap between warmed-over Tarantino satire being regurgitated as pop feminist criticism, and poking holes in a plot. The former is pretty ridiculous, especially in the context of a blockbuster action/romance movie. The latter, even a child does.
I had to look it up, not having seen BG for a very long time, but you have to admit, if the Silons would just get on with it and destroy all these pesky humans, at least the flow of bad movies and bad criticism would stop!