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

Re: [OT] Python oder Perl



On 02.Aug 2005 - 18:39:46, Frank Küster wrote:
> Andreas Pakulat <apaku@gmx.de> wrote:

Ich brauche kein CC.

> Python:
> 
> for <name> in <liste>
>     body
> 
> und in Ruby
> 
> <liste>.each { |<name>|
>     body
> }
>
> Hier passieren zwei Dinge, die für mich ungewohnt sind.  Zum einen dass
> eine Variable einer Funktion als Argument übergeben wird, indem man sie
> mit '.' verbindet

?? Also ich kenne wie gesagt Ruby nicht, aber das obige sieht eher so
aus, als ob die Variable "<liste>" ein Listenobjekt hat und auf dieser
eine Funktion "each" aufgerufen wird, die den Teil in "{}" als Argument
bekommt. Dabei verknuepft die Funktion <name> mit dem aktuellen
Element der Liste in der Iteration und fuehrt dann body aus. Ist doch
recht einfach oder?

> (anstatt wie üblich mit Klammern oder ganz ohne), und
> das ganze auch noch in postfix-Notation - also nicht each.<liste>.

?? each ist die Funktion, <liste> ist das Objekt. Das nennt man OOP, die
Methode each des Objekts <liste> wird aufgerufen. Da Perl kein OOP kennt
ist das natuerlich fuer dich neu ;-)

> Zum zweiten ein Mix von Syntaxelementen und Funktionen. 

Kannst du das genauer beschreiben? Also unter der Annahme das die
Funktion "each" wirklich ein derart komplexes Gebilde als Argument
akzeptiert ist das ein Funktionsaufruf mit Klammern "{}". 

> Der Pythonstil ist "reine Syntax", er besteht nur aus Schlüsselworten
> (und Schlüsselsymbol- en, wenn man die Einrückung berücksichtigt). In
> Ruby verwendet man eine *Funktion*, um das gleiche syntaktische
> Konstrukt zu erzeugen.

Python nutzt genau genommen auch eine Funktion um das ganze
durchzufuehren. Fuer dich schaue ich auch nochmal nach... Also, fuers
iterieren kann eine Python-Klasse ganz einfach die Funktionen __iter__.
__getitem__, __setitem__ usw. implementieren und schon kannst du ein
entsprechendes Objekt zum iterieren nutzen...

Wie das erzeugen eines Iterators und iterieren in der Sprache
"geschrieben" wird ist doch eher Sache der Sprache. In C++ mit STL
siehts ungefaehr so aus (IIRC):

std::iterator it(<liste>)
while( !it.end() )
  <body>

Man moege mir verzeihen wenn es keine end-Funktion gibt, ich nehme das
jetzt einfach mal an (ist ja eh nur Pseudocode).

> Und dann - aber das fällt mir erst jetzt auf - wird Prefix-Notation mit
> Space und Postfix-Notation mit dot gemischt:
> 
> if <name>.funktion.eins?
>    funktion.zwei "is a directory"

Nochmal zur Rekapitulation, das original war:

if element.stat.directory?
    print "is a directory"

wobei element ein Dateisystemobjekt ist. Demzufolge greift man auf das
Attribut/Methode "stat" von element zu und dann auf das Attribut/Methode
"directory" von stat. Und print sieht genauso in Python aus (wenn man
will) und Perl doch auch oder? print ist hier aehnlich wie in Perl eine
globale Funktion.

Andreas

-- 
A visit to a fresh place will bring strange work.



Reply to: