Function Call vs. Message Send

written by Martin HĂ€cker on

Oder: Wieso mich die Lisp Syntax so stört.

In meiner Freizeit beschÀftige ich mich gerade mit dem Buch Practical Common Lisp.

Das Buch gefÀllt mir auch ganz gut - vielleicht abgesehen davon das er 'loop etwas zu hÀufig verwendet - ohne es zu erklÀren - was den Code gerade am Anfang reichlich magisch macht.

Aber: Worum es mir eigentlich geht, ist die Syntax von Lips. Nicht die Klammern, nicht die EinrĂŒckung, nicht die Art wie man es schreibt, sondern schlicht die Reihenfolge.

Weil: in Lisp ist erst einmal alles auf Funktionen abgebildet. Und das hat Vorteile aber eben auch einen gravierenden Nachteil: Jede Funktion muss immer als erstes in einem Funktionsaufruf Tupel stehen.

(funktion argument-eins argument-zwei)

Das ist ein Problem, weil man bei verschachtelten Funktionsaufrufen (auch schon bei nur sehr wenigen Ebenen) sehr schnell den Überblick verliert welcher Funktionsaufruf zu welchem argument gehört.

(funktion (funktion-zwei argument-eins (funktion-drei argument-eins argument-zwei)) argument-zwei)

Das kann man jetzt natĂŒrlich auch als Feature sehen, weil man gezwungen wird seinen Code vernĂŒnftig einzurĂŒcken und keine zu langen Funktionen zu schreiben

(funktion (funktion-zwei argument-eins
                     (funktion-drei argument-eins argument-zwei)) 
        argument-zwei)

Das hilft, aber eben nur so weit. Vor allem weil man beim Lesen von Code immer eine interne herumdrehung machen muss um den Code korrekt zu lesen.

(defparameter a-list (list 1 2 3 4 5))

(car (cdr (cdr (cdr a-list))))

Soll (wenn (ich) (mich nicht verschrieben) habe) 5 ergeben.

Aber man muss es von innen nach aussen lesen, damit man es richtig versteht.

Und das erfordert jede menge Geistige KapazitĂ€t, die besser beim finden von guten Namen fĂŒr Variablen und Funktionen aufgehoben ist. Viel besser.

Jetzt zum Message-Passing - das ist zwar fundamental "weniger mÀchtig" als der Funktionsaufruf, weil man zum Beispiel generische Funktionen nicht oder nicht so gut implementieren kann, ABER: man kann viel besser mit dem resultat eines vorherigen Aufrufes das nÀchste tun.

Weil die Reihenfolge in der die Sachen ausgefĂŒhrt werden die gleiche ist in der die Sachen auf dem Bildschirm stehen.

Und das ist eine ganze Menge besser les- und versteh-bar als die Funktion es jemals sein kann.

Das war es was Alan Kay meinte, als er sagt das das wichtigste an Smalltalk) nicht die Objektorientierung, sondern das Message Passing gewesen ist.