[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: why tail recursion matters and why Java isn't it, was Re: lispperformance was Re: problems with lisp

>>>>> "Pascal" == Pascal Costanza <costanza@iai.uni-bonn.de> writes:

Pascal> Michael Sperber wrote:
>> Tail recursion is a pretty fundamental semantic property, and it sure
>> isn't about "efficiency."  (And, as such, it's anything but
>> specialized.)  I'll leave it to Shriram to yell at you some more :-)

Pascal> I didn't have general tail recursion in mind but "proper tail
Pascal> recursion" as required by Scheme.

So did I.  Sorry for omitting the "proper."

Pascal> This is a specialized feature because it is not widely found
Pascal> in other languages. It ensures space efficiency.

It ensures expressibility, and once again, it's a fundamental property
of the semantics.  Scheme just gives that property its due.  The fact
that most other programming languages don't have proper tail recursion
is a mistake.

Pascal> Why should it be important to cover all cases? 
>> Because you may not be able to write the program you need if you
>> don't.

Pascal> Such a reasoning would rule out all program analysis tools because
Pascal> there is a very important class of program properties that you
Pascal> provably cannot express. Still, program analysis tools are being
Pascal> written, and they are useful.

I don't see what this had to do with anything.  Where does program
analysis come in all of a sudden?

Pascal> The same holds for iteration: You may not be able to cover important
Pascal> cases, but this doesn't mean that you shouldn't include them for the
Pascal> cases you _can_ cover.

So ... ermh ... yes.  I never said any different.  Neither did Matthias.

Pascal> Note that I don't argue for reclacing recursion by iteration. That
Pascal> would be stupid.

One again, iteration is a special case of recursion.  In a lot of
cases, replacing (non-iterative) recursion by iteration makes perfect sense.

Pascal> I disagree. Programming language design should not be purely based on
Pascal> the mathematical aesthetics of simplicity and generality. Programmer's
Pascal> convenience is also important.
>> This isn't anything to agree or disagree on: It's a fact.  Exposing
>> iteration in a form that doesn't utilize explicit calls (looping
>> forms, that is) is a different matter.  You need to adjust your use of
>> terminology.

Pascal> I don't get this. I think that loop expressions makes programming more
Pascal> convenient, so in my view these things are clearly related.

You are just not reading what Matthias and I are writing.  You're
talking about "convenience," while Matthias and I are talking about
principles and terminology.  You're using the terminology in a wrong way.

Pascal> In my example, what I want is to collect the cars of all elements in a
Pascal> list. I simply don't care whether this is achieved by iteration, by
Pascal> recursion, or by sending a rocket to Mars and blowing it up. And the
Pascal> LOOP implementation explicitly tells me: "for all elements in the
Pascal> list, collect their cars." How can this be any clearer?
>> By explaining what you mean by "collect."  And by writing down the
>> order of the collection.  Try writing down solutions where the
>> accumulating operation isn't cons, but, say +, and, or -.  This should
>> be a matter of simple replacement, right?

Pascal> (loop for i in list sum i)

Pascal> (loop for i in list sum (- i))

Pascal> However, (apply '+ list) or (apply '- list) are more appropriate in
Pascal> this regard. (In the case of - you get different results, but this is
Pascal> because of the way - is defined.)

So what about AND?

And how do you know this has the same associativity behavior?

Cheers =8-} Mike
Friede, Völkerverständigung und überhaupt blabla