Kann man sich eigene Statement´s programmieren?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Sonntag 9. November 2008, 11:17

Hallo

Mal so ne Frage (google und die Board Suche haben nichts gebracht) ist es möglich Statements zu Programmieren?

Mal schnell was ich meine:

bis her:

Code: Alles auswählen

import hallo

hallo("Dies ist die Nachricht") #Es geht ein fenster auf und ginb den String aus
neu

Code: Alles auswählen

import hallo
hallo "Dies ist die Nachricht" #Es geht ein fenster auf und ginb den String aus
Gruß
Andyh[/code]
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Sonntag 9. November 2008, 11:25

Meines wissens geht das nicht.
Die Frage wäre auch, wozu man das möchte, solange du "statements" möchtest, so dass du einen Namen und Argumente angibst, und damit eine Aktion auslösen möchtest, ist der Hauptunterschied unterschied zu einer Funktion (oder einem beliebigen Callable, btw), dass du runde Klammern brauchst.

Was spricht gegen eine Funktion? Versuchst du, ruby-eske konfigurationsdateien zu basteln, und dir ist die Optik wichtg?
Zuletzt geändert von keppla am Sonntag 9. November 2008, 11:28, insgesamt 1-mal geändert.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Sonntag 9. November 2008, 11:26

Hallo

Wie so oft bei mir hat das keinen keinen sinn ich möchte nur wissen ob man sowas machen kann.

Scheint ja nicht so.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
BlackJack

Sonntag 9. November 2008, 11:29

@Andih: In reinem Python geht das nicht. Wird von den Python-Entwicklern als Stärke angesehen und nicht als Schwäche.

Ein Grund warum das keine so gute Idee in Python ist: Schlüsseworte dürfen nicht als Bezeichner verwendet werden. In Deinem Beispiel würde `hallo` dann nicht mehr als Name verwendbar sein. Auch nicht als Modulname, das ``import`` ginge dann zum Beispiel nicht mehr.

Schau Dir vielleicht mal EasyExtend an wenn Du trotzdem mit Syntaxänderungen spielen möchtest.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 9. November 2008, 12:19

Andyh hat geschrieben:Wie so oft bei mir hat das keinen keinen sinn ich möchte nur wissen ob man sowas machen kann.
Nein. In Lisp ist sowas jedoch weit verbreitet, das Stichwort dort ist "Makro".
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Sonntag 9. November 2008, 12:35

Hallo

Gut verstanden, geht nix

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 9. November 2008, 13:14

Ist vermutlich auch gut so. Sonst würde der Progger irgendwann nicht mehr genau wissen, was er jetzt als Statement und was als Methode definiert hat. Okay, ein guter Programmierer kennt seinen Code, aber es stiftet auf jeden Fall Verwirrung... :)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 9. November 2008, 15:20

Wer Guy Steeles (legendären) OOPSLA-Vortrag Growing a Language kennt, weiß, dass er die Erweiterbarkeit einer Sprache für eine wichtige Eigenschaft hält (Somit ist dann auch seine neue Sprache Fortress extrem erweiterbar). Dies ist eine Schwäche vieler existierender Sprachen wie Java, C, C,# aber auch Python. In C# wird es dadurch ausgeglichen, dass Microsoft fast jedes Jahr eine neue Version mit erweiterter Syntax raushaut :) Andere Sprachen - prominentestes Beispiel ist sicherlich Lisp, aber auch Forth oder Smalltalk sind hier stark - kann man als Entwickler derart erweitern, dass irgendwelche Kontrollstrukturen oder sonstige Syntax nichts besonderes sind. Das erlaubt es, mit Hilfe von DSLs die Programmiersprache optimal an das jeweilige Problem anzupassen. Ruby schafft es, obwohl man die grundlegende Syntax nicht anpassen kann, dennoch so auszusehen - weil man anscheinend neue Anweisungen bauen kann, indem man bei Funktionsaufrufen die Klammern weglassen darf. Nachteil von DSLs ist, dass es kein festes Set an Syntax gibt, an dem sich der Anfänger orientieren kann.

Stefan
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Sonntag 9. November 2008, 15:21

Ein Statement ist nicht umsonst eins, sondern ist klar trennbar von einer Funktion. Eine Funktion hat immer eine Aufgabe, die direkt mit Daten zu tun hat. Ein Statement dagegen wird bei Dingen verwendet, für die man auch Funktionen verwenden müsste, die aber nichts mit Daten direkt zu tun haben. Beispiel Kontrollstrukturen. Braucht man immer, haben aber nichts mit Daten (also Eingabe -> Ausgabe) zu tun, sondern nur mit der Sprache selbst. Deswegen finde ich die Art und Weise, wie Python das löst, sehr gelungen. Einzig das print Statement fällt da aus der Reihe, bis py3k.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Sonntag 9. November 2008, 15:26

sma hat geschrieben:weil man anscheinend neue Anweisungen bauen kann, indem man bei Funktionsaufrufen die Klammern weglassen darf.
ich würde sagen, die schaffen das eher durch anonyme Funktionen/Codeblöcke und dadurch, dass alle Klassen erweiterbar sind.
Dass man nach (anfangs) etwas merwürdig anmutenden regeln sowohl runde als auch geschweifte Klammern weglassen kann/muss soll wohl eher der Lesbarkeit dienen, würde die entstehenden DSLs aber nicht verhindern, sondern nur noch mehr nach Smileygemetzel aussehen lassen.
BlackJack

Sonntag 9. November 2008, 15:36

@str1442: Ich weiss nicht ob ich Deine Aussage richtig verstehe. Kommt es nicht auch sehr stark darauf an, was man als "Daten" ansieht? Wenn man Code auch als Daten ansieht, ist Deine Unterscheidung hinfällig. Und da in Python auch Module, Funktionen und Klassen Objekte sind, ist die Unterscheidung zwischen Daten und Code auch schon recht aufgeweicht. Natürlich nicht so stark wie zum Beispiel bei Lisp, Scheme, oder Io.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 9. November 2008, 15:45

str1442 hat geschrieben:Ein Statement ist nicht umsonst eins, sondern ist klar trennbar von einer Funktion.
Das ist eine Design-Entscheidung, die nicht jede Programmiersprache so trifft. In Lisp gibt es keine Anweisungen (statements) sondern nur Ausdrücke (expressions). Bei Smalltalk ist es genau und Forth kennt nur Wörter, die den Stack manipulieren.

Ich halte die Entscheidung für eine Einschränkung der Flexibilität, weil man a) die Statements explizit definieren muss und b) es zu Redundanzen kommt, etwa wenn man nicht nur bedingte Anweisungen sondern auch bedingte Ausdrücke (in Python das `consequence if condition else alternative` und in {}-Sprachen das `cond ? cons : alt`) haben möchte.
str1442 hat geschrieben:Beispiel Kontrollstrukturen. Braucht man immer, haben aber nichts mit Daten (also Eingabe -> Ausgabe) zu tun, sondern nur mit der Sprache selbst.
Bedingte Ausdrücke erwähnte ich ja schon. Der Kontrollfluss ist außerdem untrennbar mit der Datenverarbeitung verbunden und nicht davon getrennt.

In Lisp ist das `if` (oder das allgemeinere `cond`) traditionell eine "Special Form" und damit eigentlich eine primitive Anweisung, doch das Lamda-Kalkül erklärt, wie man bedingte Anweisungen zu bedingten Ausdrücken mit Hilfe von lambda und Funktionen höherer Ordnung machen kann. Statt Funktionen kann man auch Objekte benutzen, so wie es Smalltalk macht.

Dort gibt es Block-Objekte, die Programmfragmente repräsentieren und denen man die Nachricht "value" schicken kann (also die Methode "value" aufrufen kann, doch man nennt es eben Nachrichten schicken). Es gibt zwei Klassen True und False für die beiden einzigen Exemplare true und false und diese Klassen implementieren Methoden wie z.B. ifTrue:ifFalse:, die zwei Blöcke übergeben bekommen und danach dann einen auswählen. In Python-Syntax sähe das so aus:

Code: Alles auswählen

class True:
  def ifTrue_ifFalse_(self, trueBlock, falseBlock):
    return trueBlock.value()

class False:
  def ifTrue_ifFalse_(self, trueBlock, falseBlock):
    return falseBlock.value()
und wie man sieht, ist das alles, was notwendig ist, um eine bedingte "Anweisung" in der Sprache mit primitiveren (aber mächtigeren) Mitteln zu realisieren. Keine Notwendigkeit, dies als Teil der Syntax zu sehen.

Gleichzeitig kann ich mir beliebige weitere Kontrollstrukturen bauen wie ein "while" oder ein "switch-case".
str1442 hat geschrieben:Einzig das print Statement fällt da aus der Reihe, bis py3k.
Nein, auch andere: Z.B. `import`. Vergleiche dies mit der Funktion `__import__`. Über `break` und `continue` könnte man streiten. Diese könnte man auch mit `raise` und speziellen Exceptions realisieren. Und `raise` müsste auch keine Anweisung sein. Objektorientiert würde ich erwarten, dass ich einem Exception-Objekt eine entsprechende Nachricht schicken könnte.

Die Menge der Anweisungen ist einfach eine Design-Entscheidung, die IMHO hauptsächlich vom Geschmack des Sprachdesigners beeinflusst ist.

Stefan
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Sonntag 9. November 2008, 21:08

@str1442: Ich weiss nicht ob ich Deine Aussage richtig verstehe. Kommt es nicht auch sehr stark darauf an, was man als "Daten" ansieht? Wenn man Code auch als Daten ansieht, ist Deine Unterscheidung hinfällig. Und da in Python auch Module, Funktionen und Klassen Objekte sind, ist die Unterscheidung zwischen Daten und Code auch schon recht aufgeweicht. Natürlich nicht so stark wie zum Beispiel bei Lisp, Scheme, oder Io.
Naja, was wohl etwas schlecht ausgedrückt.
Eine Klasse bildet ja den Typ eines Objektes ab.
Eine Methode eine Aktion seitens eines Objektes.
Eine Funktion bildet eine Tätigkeit ab, die meist sehr generell gehalten ist.
Ein Statement dagegen hat ja nichts direkt mit einer Tätigkeit zutun. Außer aus der Sicht einer Sprache, intern ist es dort natürlich eine Tätigkeit. Aber für ein Programm in dieser Sprache ist "if" oder "return" keine Tätigkeit. Deswegen macht es auch keinen Sinn, zig Statements zu definieren oder gar neue, ziemlich schnell ist jede dieser "nicht-Tätigkeiten" in Bezug auf das Programm definiert.

Im Grunde meine ich, das Statements etwas aus der Reihe fallen, auch wenn sie direkt mit den Daten verbunden sind.

Hm, immernoch wirr :?

@sma

Mir ist schon klar, das andere Sprachen (und insbesondere Funktionale) diese Dinge anders umsetzen, aber viele Sprachen nutzen Statements (oder ähnliche Dinge) eben nicht wie Funktionen. Ein Statement ist eben eine Anweisung an die Sprache (bzw deren Interpreter / Compiler), aber nichts, was unmittelbar mit den zu verarbeitenden Daten / Objekten zu tun hat. Statements fallen aus der Reihe, das wollte ich damit ausdrücken. Sieht man auch in C ganz gut: If, for usw sind dort ja Funktionen und haben entsprechende Funktionsköpfe, legen dann aber noch einen Funktionsbody an, der ja nicht direkt mit dem Aufruf zu tun hat. Sowas macht man eigentlich nur bei der Definition einer Funktion, nicht aber beim direkten Anwenden. Wenn man also Statements generell als Syntax Element einführt, muss man später nicht auf derartige Ausnahmen zurück greifen (es sei denn, man macht es sowieso komplett anders).
Ich halte die Entscheidung für eine Einschränkung der Flexibilität, weil man a) die Statements explizit definieren muss.
Das wollte ich ja darstellen, das man nicht sonstwieviele Statements definieren kann. Ansonsten gibts ja keinen Unterschied zu Funktionen mehr.
b) es zu Redundanzen kommt, etwa wenn man nicht nur bedingte Anweisungen sondern auch bedingte Ausdrücke (in Python das `consequence if condition else alternative` und in {}-Sprachen das `cond ? cons : alt`) haben möchte.
Inwiefern sollte es da zu Überflüssigem kommen? Ich würde sowas übringens rein logisch nicht als Ausdruck ansehen, sondern als eine Vereinfachung der Variablenzuweisung. Die Bedeutung eines Statements (wie ich es hier auffasse) bleibt auch hier erhalten.

Danke für den kleinen Exkurs :D

@Import: Gut, stimmt, im Grunde ist import einer Tätigkeit ähnlicher als etwas anderem.

@raise: Das meine ich zum Beispiel mit "Nicht-Tätigkeit". Es tut nichts, was man nicht auch Objekt Orientiert machen könnte. Aber es ist in einem Programm auch irgendwo fehlplatziert, mit einem Objekt zu arbeiten, das im Grunde nur die Sprache als Solches etwas angeht (Welche Methoden sollte ein Exception Objekt denn noch haben, mit denen man arbeiten könnte? Irgendwo musses ja aufhören, man kann also auch nicht konsequent bleiben). Da ist es mir lieber, ein neues Exception Objekt zu erstellen, aber den Rest Python machen zu lassen (durch raise zb), anstatt nun mit irgendwelche Objekt Methoden zu arbeiten, die etwas tiefer ins Sprachdesign greifen.

Hoffentlich ist es jetzt klarer geworden, wie ich das meine.
BlackJack

Sonntag 9. November 2008, 22:44

@str1442: Also ich finde es wird immer unklarer und widersprüchlicher.

`return` ist durchaus eine Tätigkeit und eine Auswahl eines auszuwertenden Codes mit `if` zu treffen, kann man ebenfalls als Tätigkeit ansehen. Beides hat auch unmittelbar mit den Daten des Programms zu tun. `return` sogar ziemlich direkt mit den Daten.

`if` und `for` sind in C *Funktionen*!? Wäre mir neu.

Wenn Du keine Ausnahmen haben willst, dann musst Du Statements gerade *weglassen*. Siehe zum Beispiel Lisp und Scheme oder bei einer nichtfunktionalen, OOP Sprache Io. Da sind die typischen "Statements" syntaktisch nicht von Funktionen zu unterscheiden und man kann selber Funktionen/Methoden implementieren, die "Statements" entsprechen. Da gibt's dann natürlich keinen Unterschied mehr zwischen "Statements", also in diesem Fall in der Standardbibliothek implementierte Varianten von `if`, `for`, usw., und eigenen Funktionen/Methoden. Aber warum muss es den geben?

Es kommt zu "überflüssigem" wie dem ``a if c else b`` weil das in anderen Sprachen schon vom "normalen" `if` abgedeckt wird. Ausdrücke sind Konstrukte, die zu einem Ergebnis ausgewertet werden. Damit ist das Konstrukt per Definition ein Ausdruck. Es ist ja überhaupt nicht an Zuweisungen gebunden -- man kann es überall verwenden, wo ein Wert bzw. eben ein Ausdruck erwartet wird.

`raise` ist genau wie `return` eine Tätigkeit. Wieso sollte es keine Objekte geben, die "Interna" der Sprache repräsentieren? Und wieso muss man irgendwo aufhören? Schau Dir mal Io an. Mit der Argumentation dürfte es zum Beispiel kein `gc`- oder `compiler`-Modul in Python geben. Oder bei PyPy die Metaebene, über die man an die Objekte des Interpreters kommunizieren kann.

Was ist der Vorteil eines ``raise``-Statements gegenüber einer Methode auf Ausnahmen? Ein Ausnahme-Objekt könnte noch eine `catch()`-Methode haben, eine Methode die den Stacktrace liefert, und eine `pass()`-Methode, die die Methode erneut "raise"t. Siehe Io.

Und in Python gibt's doch auch eine Menge (magische) Methoden, die in die Bedeutung von Statements eingreifen. Was ``for`` genau macht, hängt massgeblich davon ab, was der Programmierer als `__iter__()` auf Objekten implementiert. Das ``with``-Statement wird duch `__enter__()` und `__exit__()` implementiert, in den Import-Mechanismus kann man sich einklinken, usw. Man kann da in Python sehr viel machen, indem man der vorhandenen Syntax ziemlich weitgehend eigene Bedeutung unterschieben kann, man kann nur keine neue Syntax einführen.
Qubit
User
Beiträge: 75
Registriert: Dienstag 7. Oktober 2008, 09:07

Sonntag 9. November 2008, 23:01

Andyh hat geschrieben:Hallo

Mal so ne Frage (google und die Board Suche haben nichts gebracht) ist es möglich Statements zu Programmieren?

Mal schnell was ich meine:

bis her:

Code: Alles auswählen

import hallo

hallo("Dies ist die Nachricht") #Es geht ein fenster auf und ginb den String aus
neu

Code: Alles auswählen

import hallo
hallo "Dies ist die Nachricht" #Es geht ein fenster auf und ginb den String aus
[/code]
Ohne in die "Hartverdrahtung" einzugreiffen...

Code: Alles auswählen

import code
class CustomCmd(code.InteractiveConsole):
     def raw_input(self, prompt=None):
         while 1:
             text = raw_input(prompt)
             if text.startswith("hallo"):
                 print "Fenster mit ",' '.join(text.split(' ')[1:])
             else:
                 return text

cmd = CustomCmd()
cmd.interact()


Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(CustomCmd)
>>> hallo "Dies ist die Nachricht" 
Fenster mit  "Dies ist die Nachricht" 
>>> 
Antworten