Steven D'Aprano <[EMAIL PROTECTED]> schreibt:

> On Sat, 09 Dec 2006 14:00:10 +0000, Timofei Shatrov wrote:
>
>> On Sat, 09 Dec 2006 20:36:02 +1100, Steven D'Aprano
>> <[EMAIL PROTECTED]> tried to confuse everyone with this
>> message:
>>
>>>On Fri, 08 Dec 2006 23:38:02 -0800, Wolfram Fenske wrote:
>>>
>>>> if Common Lisp didn't have CLOS, its object system, I could write my own
>>>> as a library and it would be just as powerful and just as easy to use as
>>>> the system Common Lisp already provides.  Stuff like this is impossible
>>>> in other languages.
>>>
>>>Dude. Turing Complete. Don't you Lisp developers know anything about
>>>computer science?
>>
>> Here, you've basically shot yourself in the ass. Appealing to
>> Turing completeness when talking about programming language
>> features is about the dumbest thing you can make. In Turing sense,
>> a program is simply a function that takes an argument and returns a
>> value. It doesn't say anything about how this function was
>> implemented. It could be Turing machine, lambda calculus, Markov
>> chains or whatever else. All these methods produce the same set of
>> programs, but that doesn't mean you could implement lambda in
>> Turing machine for example.

[...]

> If you're talking about practicality, then of course you're correct,
> not all languages are equally expressive. Some languages are not
> expressive enough.

I agree.

> Some languages are too expressive.

I disagree.  "Too expressive"--what a thing to say.

[...]

> Look, all snarkiness aside, it just isn't true that "stuff like this
> is impossible in other languages". If Wolfram Fenske had said "stuff
> like this isn't easy in many other languages" he would have been
> right.

I said that it's impossible to write you own object system in other
languages *and* have it behave like it was part of the language.  OK,
you could always write your own pre-processor, i. e., your own
Foo+Objects to Foo compiler.  But that's almost like saying it's
impossible.  Now, object systems aside, how about that one: One of the
new features of Python 2.5 is a syntax for

--8<---------------cut here---------------start------------->8---
if condition:
    x = true_value
else:
    x = false_value
--8<---------------cut here---------------end--------------->8---

which becomes

--8<---------------cut here---------------start------------->8---
x = true_value if condition else false_value
--8<---------------cut here---------------end--------------->8---

(see [1]).  IMO that's a nice addition because this pattern is
something that has bothered me for some time.

Here's another one, the "with" statement [2]:

--8<---------------cut here---------------start------------->8---
Some standard Python objects now support the context management
protocol and can be used with the 'with' statement. File objects are
one example:

with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...

After this statement has executed, the file object in f will have been
automatically closed, even if the 'for' loop raised an exception
part-way through the block.
--8<---------------cut here---------------end--------------->8---

My point is that in Python--and AFAIK any other language except maybe
OCaml and maybe maybe Haskell--, you have to wait for these changes
until the language designers decide to make the for you.  And if they
don't, you're out of luck.  In Lisp, you can just add this yourself.

> And if he had said "and stuff like this carries risks as well as
> benefits" he would have come across as less of a language fanatic.

Sure, you can shoot yourself in the foot with macros.  But you can do
that in any language of any degree of expressiveness [3].  Come to
think of it, the whole reason why we use high level languages is
because of their expressiveness: We get stuff done faster and
introduce less errors.  So "the more expressive, the better," right?
But according to you, there's a point when a language gets "too
expressive".  I don't see why.

> One of the risks with Python is the ease with which you can modify the
> built-ins. An expression like list(2, 3, 4) doesn't necessarily create a
> list from 2, 3, and 4, because the built-in list could be redefined.
> (In practice, that's not often a real problem, because experienced
> Python developers simply learn not to needlessly or confusingly shadow
> built-ins. It's not the best system, but it works well enough in
> practice.)

So you do trust your developers not to do anything stupid.

> But at least the basic syntax and keywords of the language are known
> to be constant.  With Lisp macros, even that isn't guaranteed.

Let me summarize: you're allowed to redefine every built-in function
you want but introducing new syntax is simply too much.  See, this is
the kind of thinking I don't understand.  I say macros are good
because a), b), and c) and you answer macros are bad because, uhm,
well, it would be pure anarchy.

> Now, if Lispers would say "Oh yes, macros give you great power, and
> with great power comes great responsibility. Be careful." then, no
> doubt, we'd take you guys more seriously.

Sure, it's a powerful tool but it's not *that* hard to use.  Maybe
you're afraid of it because that it's something that's unique to Lisp?
But IMO the reason for that is not that they're too powerful.  IMO it
has mostly to do with the fact that other languages' syntaxes make it
too difficult to implement Lisp-style macros.

> But we don't hear that -- we hear Lispers going on and on about how
> great it is that they can easily redefine every corner of the
> language. Do you blame people for *believing them* and imagining
> that reading Lisp code is like following some ghostly
> will-o-the-wisp across a swamp, where nothing is what it seems and
> the landscape is forever shifting?

Come on!  You're telling me people don't learn Lisp because they are
afraid of it?  Python allows you to redefine built-in functions, as
you said, Ruby allows you to attach new methods to live objects, but
Lisp is simply going too far?

> Now, if you want to tell me that, despite all the talk, Lisp coders
> don't actually create new syntax or mini-languages all that often,
> that they just use macros as functions, then the question becomes:
> why do you need macros then if you are just using them as functions?
> Why not use functions?

Easy because macros are not functions.  Functions allow you abstract
functionality, macros allow you abstract syntax.  Look at the examples
above.  How would you implement conditional expressions as a function?
Answer: You can't, it's syntax.


Footnotes:
[1]  <http://docs.python.org/whatsnew/pep-308.html>

[2]  <http://docs.python.org/whatsnew/pep-343.html>

[3]  And here's the proof
     <http://www.reed.edu/~tuckers/jokes/foot.html> :-)

--
Wolfram Fenske

A: Yes.
>Q: Are you sure?
>>A: Because it reverses the logical flow of conversation.
>>>Q: Why is top posting frowned upon?

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to