Funktionale Programmierung mit Haskell



  • knivil schrieb:

    Das liegt daran, dass Lisp Die Mutter aller Programmiersprachen ist (na gut, ausser von Fortran).

    will ich meinen, fortran ist älter. ausserdem gibt's, äääh gabs, noch das: http://de.wikipedia.org/wiki/Plankalkül
    🙂



  • Du bist ganz schoen pingelig. Die Griechen hatten sicherlich auch sowas wie eine Programmiersprache ("Wie-Rechne-Ich-Mit-Dem-Abakus"), aber leider konnte sie sich auf (modernen) Rechenmaschinen nicht durchsetzen. Auch ist Fortran garnicht so viel aelter und besass am Anfang nicht die Ausdruckskraft von Lisp.



  • knivil schrieb:

    Die Griechen hatten sicherlich auch sowas wie eine Programmiersprache ("Wie-Rechne-Ich-Mit-Dem-Abakus"), aber leider konnte sie sich auf (modernen) Rechenmaschinen nicht durchsetzen.

    naja, es gab auch noch mechanische rechenmaschinen, da war dann das 'programm' eine hardcodierte anordnung von walzen und zahnrädern. und analgrechner wollen wir auch nicht vergessen, die über ein steckbrett programmiert wurden.
    🙂



  • knivil schrieb:

    Das liegt daran, dass Lisp Die Mutter aller Programmiersprachen ist (na gut, ausser von Fortran). Seltsam ist das nicht, sondern ein Fakt.

    Daß LISP die "Mutter aller Programmiersprachen ist", ist doch nicht wörtlich zu nehmen, sondern in dem Sinne, daß man mit LISP viele andere Paradigmen nachbilden kann, weil LISP eine äußerst einfache und mächtige (also elegante) Notation ist.

    Jedes Paradigma (funktional, deklarativ, imperativ, strukturiert, objektorientiert, ...) hat seine eigenen Ahnen, und Fortran, Algol, Forth oder Smalltalk sind da nicht weniger wichtig als Lisp.

    Denk dir mal Algol weg - was würde dann heute alles fehlen? C, C++, Pascal et al., ...



  • Nein, das ist schon ernst gemeint. Selbst in der JavaVM stecken Ideen von Lisp. Leider ist das vom Marketing eher schlecht. Ausserdem habe ich in einem vorigen Post geschrieben, das man Teile von C und Teile von Lisp nimmt und dadurch neue Sprachen wie javascript, Ruby etc. bekommt. Selbst C++ bekommt sein lambda.

    viele andere Paradigmen nachbilden kann

    Nein gerade nicht. In Lisp wurden diese Paradigmen erfunden. Objektorientierung gibt es schon lange vor jeder anderen objektorientierten Sprache, multiple dispatch ist ein alter Hut ... Wie wurde es in dem Beitrag formuliert: Redet man mit Lisp-Programmierern, bekommt man nur als Antwort: "Kenn ich schon, hab ich schon, war ich schon".



  • daß Teile von LISP in vielen neueren Sprachen stecken, bezweifele ich nicht - das habe ich übrigens gestern selbst geschrieben.

    Auch in aktuellen Bytecode-VMs mag die eine oder andere Idee von LISP stecken (obwohl - welche genau sollte das denn sein?), dort stecken aber eigentlich viel mehr Ideen von Smalltalk - Smalltalk hat ein klassenbasiertes Objektmodell ähnlich wie java und lief schon vor rund 30 Jahren auf einer Bytecode-VM !

    Dennoch ist LISP nicht "die Mutter aller Sprachen" - die gibt es gar nicht. Es gibt verschiedene Programmier-Paradigmen, und jedes hat seine eigenen "Mütter" und "Väter" - Fortran, Algol, Simula+Smalltalk, Forth, Prolog, um nur mal ein paar wichtige "Ahnen" zu nennen.

    PS. weder in Ruby noch in Javascript sind "LISP + C" die einzigen oder bedeutendsten Einflüsse - in Ruby ist der Einfluß von Smalltalk deutlicher zu erkennen als der von LISP, Javascript ist mit seinem prototypenbasierten Objektmodell näher an Self als an LISP, und beide haben mit C nicht viel mehr gemeinsam als ein bischen Syntax und geschweifte Klammern.



  • Wie schon dargestellt, Smalltalk hat seine Urspruenge in Lisp. Das gleich gilt fuer Prolog. Aber ich bezweifle, dass sich hier irgendwer ernsthaft mit der Sprache beschaeftigt und nicht einschaetzen kann, was Lisp alles bietet. Lisp ist eine fertige entwickelte Sprache. Und meist, wenn ich all die tollen "neuen" Sachen sehe, dann gab es das schon in Lisp.



  • Daß man andere Programmierstile (zB. OOP) in LISP simulieren kann, ist nichts LISP-spezifisches.

    Sondern das liegt daran, daß LISP durch seine minimale Syntax so flexibel ist.

    Das selbe gilt für andere Sprachen mit minimaler Syntax, etwa Forth und Tcl. Frag' mal einen Tcl'ler nach OOP - da gibt es auch nur ein müdes Lächeln, denn Tcl hat nicht etwa ein, sondern ein halbes Dutzend verschiedener Objektmodelle, von denen etliche dazu noch in Tcl selbst definiert sind!!

    Ähnlich bei Forth - Objektmodell-Aufsätze auf Forth lassen sich in wenigen hundert Zeilen Forth-Code implementieren. Mit Scheme geht das auch. Sogar Algol-ähnlicher Style läßt sich in Scheme simulieren.

    Also nichts LISP-Spezifisches. LISP ist nicht die "Mutter aller Programmiersprachen", LISP ist der Urahn der funktionalen Programmierung. Das schmälert die Bedeutung von LISP ja nicht.

    Und Smalltalk hat seine Ursprünge definitiv nicht in LISP, zumindest nicht allein. Nachzulesen ist der Zusammenhang in der von mir oben erwähnten Arbeit "The Early History of Smalltalk".



  • LISP-Spezifisches

    Wer behauptet denn sowas? Und darum geht es auch garnicht. Ich sage ja nicht, dass Lisp die einzige OOP-Sprache ist, sondern lediglich, dass viele Ideen von dort uebernommen wurden. Und was bedeutet simulieren bei dir?

    Frag' mal einen Tcl'ler nach OOP

    Boese Zungen koennten behaupten, dass es von Lisp abgeschaut ist. Hast du denn schon mal OOP-Ansaetze in Lisp bzw. Scheme gesehen?

    Aber mal ehrlich, befasst du dich aktiv mit Lisp? Deine Beispiel mit Tcl und Forth scheinen ja eher die Mutter aller Programmiersprachen zu unterstuetzen. Der Nachrichtenmechanismus von Smalltalk wird kurz als Beispiel in SICP angerisssen und vieles mehr ... Auch habe ich keine Ahnung, warum du dich so aufregst? Nimm es einfach nicht so persoenlich.



  • Ich bleibe bei meiner gut begründeten Meinung: Es gibt nicht die "Mutter aller Programmiersprachen", weder im wörtlichen noch in sonst einem Sinne.



  • Ach, ich finde das "Mutter aller Programmiersprachen" nicht so völlig unbegründet. Selbst wenn vielleicht keine direkten Verwandschaftsverhältnisse sichtbar sind, darf man eine Programmiersprache, die als erste Sprache überhaupt ein "if/then/else", Garbage-Collection, Rekursion und andere Features besaß, die heutzutage jede Sprache bzw. sehr viele Sprachen haben.



  • Insbesondere garbage collection, das ultimate feature und Killerargument von Java trat das erstemal 1960 in From von Lisp hervor. 1960 ... und da soll Java noch 'ne Revolution sein?



  • knivil schrieb:

    Insbesondere garbage collection, das ultimate feature und Killerargument von Java trat das erstemal 1960 in From von Lisp hervor. 1960 ... und da soll Java noch 'ne Revolution sein?

    bitte sag dass du das nicht ernst meinst und nur trollen willst.



  • Shade Of Mine schrieb:

    bitte sag dass du das nicht ernst meinst und nur trollen willst.

    Klar, aber welchen Teil meinst du davon? 😃

    Ich war mir nicht ganz sicher, wann garbage collection in Lisp auftauchte, aber das sagt wikipedia dazu (jaja, wikipedia wieder):

    Garbage collection was invented by John McCarthy around 1959 to solve the problems of manual memory management in Lisp.



  • knivil schrieb:

    Shade Of Mine schrieb:

    bitte sag dass du das nicht ernst meinst und nur trollen willst.

    Klar, aber welchen Teil meinst du davon? 😃

    Wahrscheinlich "ultimates feature" und "Killerargument".



  • knivil schrieb:

    Insbesondere garbage collection, das ultimate feature und Killerargument für Java von Sun trat das erstemal 1960 in From von Lisp hervor. 1960 ... und da soll Java noch 'ne Revolution sein?



  • Ein netter Mensch schrieb:

    Java von Sun

    Achja? Kannst du das auch beweisen? Quelle? Link?



  • Shade Of Mine schrieb:

    Es ist unmöglich ein Hello World Programm zu schreiben wenn man sich an diese Definition halten muss.

    Verwirrend irgendwie.

    Vielleicht mal folgendes Beispiel.

    Man angenommen, du willst eine Zeichenkette ausgeben. Du übergibst jetzt der Funktion den Status des Universums und die Zeichenkette. Die Funktion liefert dir darauf hin eine "Kopie" des Universums zurück, in welcher die Zeichenkette "Hello World" auf dem Bildschirm erschienen ist. Diese Kopie reichst du jetzt in die nächste Funktion weiter, die Seiteneffekte haben soll.

    Das ganze macht man natürlich nicht explizit. D.h. dieses weiterreichen der Kopien des Universums wird versteckt, indem man so verkettet, dass man nicht mehr explizit schreiben muss, wo welche Kopie des Universums hinkommt. Dieses Verketten kann man dann durch Monade ausdrücken.

    Wenn man das gemacht hat, so sieht ein Hello World in Haskell genau so aus.

    main = do
        putStrLn "Hello World!"
    

    Der Vorteil ist. Wenn eine Funktion keine(!) Kopie des Universums zurück gibt, so wissen wir, dass sie auf jeden Fall das Universum nicht verändert hat. Dadurch kann man eine Menge an Fehlerquellen ausschließen.



  • Sorry, habe jetzt gerade den Faden verloren. Wer will welche Links fuer was? Ja, mit Java meine ich die Programmiersprache von Sun. Und klar ultimate feature und Killerargument sind (leicht) ironisch gemeint.



  • tfa schrieb:

    Ein netter Mensch schrieb:

    Java von Sun

    Achja? Kannst du das auch beweisen? Quelle? Link?

    Bitteschön.


Anmelden zum Antworten