Seite 2 von 2

Verfasst: Sonntag 23. Dezember 2007, 19:16
von sma
BlackJack hat geschrieben:Auch wenn ``if``/``ifTrue:ifFalse:`` bei Smalltalk und Io im Gegensatz zu Scheme nicht als besondere Syntax behandelt wird muss man trotzdem lernen, dass es etwas besonderes ist, weil die Argumente nicht unbedingt ausgewertet werden.
Oh, dann habe ich das nicht gut beschrieben. Es ist gerade nichts Besonderes. Die Blöcke [ ... ] in Smalltalk sind ein generelles Konzept und haben nichts mit der Implementierung von ifTrue:ifFalse: zu tun. Eine Fingerübung ist, sich ein eigenes case-Statement zu bauen:

Code: Alles auswählen

expr switch
  case: 1 do: [ ... ];
  case: 2 do: [ ... ];
  default: [ ... ].
Eine mögliche Implementierung:

Code: Alles auswählen

Object >> switch
  ^Switch on: self

Switch >> class on: aValue
  ^super new setValue: aValue 

Switch >> setValue: aValue
  value := aValue
  result := self

Switch >> case: aValue do: aBlock
  result == self ifTrue: [
    value = aValue ifTrue: [result := aBlock value]]
  ^result
  
Switch >> default: aBlock
  result == self ifFalse: [result := aBlock value]
  ^result
Für Io gilt das selbe in grün. Argument-Nachrichtenausdrücke werden vom Empfänger nur ausgewertet, wenn dieser es für richtig hält. Das wäre, als wenn bei Scheme alles eine Special-Form ist. Falls jemand den Scheme-Interpreter gesehen hat, den ich neulich hier gepostet hatte - der folgte genau diesem Prinzip.
BlackJack hat geschrieben:Bei der Syntax von Io gibt's mehr als eine Art von Nachrichten. Operatoren werden gesondert behandelt, damit ``a + b * c`` das aus der Mathematik bekannte Ergebnis liefert und nicht stur von links nach rechts als ``(a + b) * c`` interpretiert wird.
Das war aber nicht immer so... muss mir wohl nochmal die aktuelle Sprachbeschreibung durchlesen.
BlackJack hat geschrieben:Eine Vereinfachung der Sprache von Io gegenüber Smalltalk hast Du nicht erwähnt: in Io gibt es vom Sprachkern her keine Klassen, sondern nur Objekte.
Stimmt. Io ist hier beeinflusst von Self (wie übrigens auch JavaScript) und Self ist ein konzeptionell eingedampftes Smalltalk. Irgendwie sind klassenlose Sprachen aber nicht so beliebt, bei JavaScript definiert sich jeder erstmal Klassen hinzu und EcmaScript 4 soll sie ja auch bekommen.
BlackJack hat geschrieben:Trotzdem verstehe ich den Einwand gegen Python nicht ganz. Für mich sind OO und imperativ/funktionial orthogonale Konzepte. Weil Python eher imperativ daherkommt, während sich Io sehr funktional anfühlt, sind beide trotzdem für mich sehr objektorientierte Sprachen.
Grmpf. Ich schreibe zu viel und denke zu wenig. Ich meinte nicht imperativ, sondern prozedural. Ich stimme dir zu. Ich meinte, von der Historie her ist Python eher prozedural (prozedurorientiert) als objektorientiert.
BlackJack hat geschrieben:Und dann ist ``print('hallo')`` eben die Nachricht ``print``, die an das `__builtins__`-Objekt geschickt wird, was mit einem Funktionsobjekt antwortet, dem dann wiederum an den `__call__`-Slot eine Nachricht mit dem Argument 'hallo', einem Zeichenkettenobjekt, geschickt wird. Das Funktionsobjekt schickt dann dem `sys`-Modul-Objekt die Nachricht `stdout` und bekommt ein File-Objekt als Antwort dem dann… usw. Also letztendlich nichts anderes als `writeln()` in Io. Ein Haufen Objekte, die miteinander kommunizieren.
Ganz genau. Aber solange das nicht so erklärt wird, sondern eher mit Hilfe von Operationen und Prozedur oder Funktionsaufrufen (mir ist der Unterschied a la Pascal, wo das eine einen Wert liefert und das andere nicht egal - für mich sind Prozeduren etwas, das imperativ ist, nämlich eine Befehlsfolge beschreibt - ob die nun Seiteneffekte und ein Ergebnis hat oder nicht sei egal - selbst Scheme als durchaus eher funktionale Sprache nennt seine "Funktionen" (dieser meiner Definition folgend korrekt) procs - Prozeduren)
BlackJack hat geschrieben:PS: ``e getSlot`` ist natürlich ``e getSlot("getSlot")``. ;-)
Dir ist aber schon bewusst, dass du da jetzt immer noch sitzen würdest um das komplett aufzulösen. Es fehlt der Fixpunkt :)

Stefan