Lisp



  • knivil schrieb:

    Ich verstehe nicht so recht, was deine Idee ist.

    Stell dir vor, du willst einen Interpreter für eine Sprache mit Closures schreiben, und zwar verwendest du dafür eine Sprache, die keine Closures kennt, zB C. Du wirst dabei für jede Funktion, die auch Closure ist, eine Menge von Namen haben, die ausserhalb der Funktion festgelegt wurden, und denen also für jede Closure (jedes? jeden?) jeweils irgendein spezieller Wert zugeordnet werden muss. Dafür bieten sich assoziative Arrays an. Und weil Closures prinzipiell etwas verschachtelbares sind, müssen es auch die assoziativen Arrays sein.

    knivil schrieb:

    Aber vom Array ist es nun gar nicht weit zur List und wir waeren bei Lisp.

    "Assoziatives Array" ist vielleicht unglücklich, aber das sagt man eben so. Ich meine sowas wie eine Hashtabelle oder einen Suchbaum von Zuordnungen. Ich hätte besser einfach gesagt: "Tabelle". Bau sowas mal in Lisp nach, wenn der Interpreter keine Hashfunktion ala "gib mir den Zeiger als Zahl" kennt.

    ;fricky schrieb:

    in C geht alles, in Lisp auch? man kann in C Lisp nachbauen, kann man auch mit Lisp C nachbauen? wahrscheinlich ja.

    Warum auch nicht?
    🙂



  • Habt ihr nix sinnvolles zu tun?



  • Zeus schrieb:

    Habt ihr nix sinnvolles zu tun?

    Nö, wir sind nämlich so reich, dass wir uns nur noch fragen, ob's Spass macht.
    🙂



  • ddddddddddddds schrieb:

    Lisp ist doch unleserlich ohne Ende.

    ich hab zwar 0 ahnung von lisp, aber ich glaube, dass diese sprache ganz schön mächtig ist. diese vielen klammern sehen ziemlich fürchterlich aus, aber ein lisp-kenner wird sie wahrscheinlich garnicht mehr wahrnehmen.
    🙂



  • so selten, wie Lisp in der Praxis eingesetzt wird, muß das wirklich eine ganz schön mächtige Sprache sein 😃

    man kann mit Lisp C nachbauen und mit C Lisp nachbauen, ist schließlich beides Turing-vollständig. Man kann aber Lisp mit nur einer halben Seite Lisp nachbauen, geht das in C auch ?

    wie hieß doch gleich "Greenspuns Tenth Rule of Programming" ? 😃



  • marmor kuchen schrieb:

    so selten, wie Lisp in der Praxis eingesetzt wird, muß das wirklich eine ganz schön mächtige Sprache sein 😃

    man kann mit Lisp C nachbauen und mit C Lisp nachbauen, ist schließlich beides Turing-vollständig. Man kann aber Lisp mit nur einer halben Seite Lisp nachbauen, geht das in C auch ?

    wie hieß doch gleich "Greenspuns Tenth Rule of Programming" ? 😃

    Ein Begriff für die Berechenbarkeit zu verwendun um zu sagen, dass die andere Sprache nachbauen kann - *seufz* Schade dass ich mit Java nicht C++ nachbauen kann obwohl Java auch Turing-vollständig ist :S



  • marmor kuchen schrieb:

    so selten, wie Lisp in der Praxis eingesetzt wird, muß das wirklich eine ganz schön mächtige Sprache sein

    das liegt doch nur daran, dass Lisp für den durchschnitts-coder zu abstrakt ist (auch wenn's leute gibt, die meinen, dass irgendwelche Lisp-dialekte für einsteiger toll wären, aber sie täuschen sich).

    Zeus schrieb:

    Schade dass ich mit Java nicht C++ nachbauen kann obwohl Java auch Turing-vollständig ist

    gehen würde das schon, wäre wahrscheinlich der erste C++-compiler, der bei irgendwelchen fiesen template-konstrukten nicht abstürzt. *fg*
    die grösste schwierigkeit dabei ist wohl eher, jemanden zu motivieren, sowas zu machen.
    🙂



  • marmor kuchen schrieb:

    Man kann aber Lisp mit nur einer halben Seite Lisp nachbauen, geht das in C auch ?

    Natürlich:
    http://www.ioccc.org/1989/jar.2.c

    ;fricky schrieb:

    die grösste schwierigkeit dabei ist wohl eher, jemanden zu motivieren, sowas zu machen

    Schwer, weil sich das ^^

    Der Begriff Lisp ist ungefähr so abstrakt wie der Begriff Betriebssystem, deshalb stösst man öfter mal darauf:
    http://en.wikipedia.org/wiki/Clojure
    🙂



  • ich meinte "C auf einer halben Seite C nachbauen, geht das auch ?"

    mannomann.

    Lisp ist keine willkürlich nach praxisbestimmten Anforderungen her definierte Sprache, sondern vielmehr die Lösung einer Gleichung mit einer Unbekannten L:

    p(L) = { "alles ist eine Liste" }

    wobei

    L = die gesuchte Sprache
    p(X) = Menge alle Prinzipien, die von der Sprache X implementiert wird.



  • marmor kuchen schrieb:

    p(L) = { "alles ist eine Liste" }

    Das kann nicht einmal theoretisch stimmen. Mit "alles ist eine Funktion" hättest du eine Chance gehabt, aber das gilt für viele Sprachen.
    🙂



  • der ist gut. Daß Lisp und funk Prog nicht dasselbe ist, kann man ja nicht wissen 😃



  • marmor kuchen schrieb:

    der ist gut. Daß Lisp und funk Prog nicht dasselbe ist, kann man ja nicht wissen 😃

    Bald nachdem Lisp auch praktisch vorhanden war, haben die Lispler eingesehen, dass binäre Knoten auf Neumann-Maschinen nicht immer das Gelbe vom Ei sind. Ein ernsthaftes Lisp-System kennt zumindest noch einen zweiten teilbaren Typ, nämlich feste Arrays von Referenzen ("vectors"). Nimm das, nwp2.

    fricky schrieb:

    ich hab zwar 0 ahnung von lisp, aber ich glaube, dass diese sprache ganz schön mächtig ist.

    In seinem Kern halte ich Lisp für ein einfaches Werkzeug, um Sprachen zu bauen. Ich hab sogar schon Besessene gesehen, die sich die vollständige Klammerung für den Syntax-Baum von C antun [ (int (pointer p)) ], wahrscheinlich hauptsächlich um richtig tolle Makros bauen zu können. Nimm das, volkard.

    fricky schrieb:

    diese vielen klammern sehen ziemlich fürchterlich aus, aber ein lisp-kenner wird sie wahrscheinlich garnicht mehr wahrnehmen.

    Schade, ich hab schon gewartet und wollte sagen: welche Klammern?
    Aber es geht auch so:

    Parentheses? What parentheses? I haven't noticed any parentheses
    since my first month of Lisp programming. I like to ask people who
    complain about parentheses in Lisp if they are bothered by all the
    spaces between words in a newspaper...
    -- Kenny Tilton tilt@liii.com

    🙂



  • Neue Frage:

    Gibts eigentlich ein Lisp (Common Lisp oder Scheme), welches eine vernünftige GUI Bibliothek bietet? Bis jetzt ist mit da nur PLT Scheme aufgefallen und optisch ist das unter aller Kanone - für kleine Inhouse-Sachen vielleicht OK, aber veröffentlichen kann man mit der Optik heut nichts mehr.
    Und für andere Implementationen scheints wenn überhaupt nur sehr halbgare Bindings für GTK oder QT zu geben.



  • maximAL schrieb:

    Neue Frage:

    Gibts eigentlich ein Lisp (Common Lisp oder Scheme), welches eine vernünftige GUI Bibliothek bietet?

    ccl (http://en.wikipedia.org/wiki/Clozure_CL) kann man recht nett mit cocoa verbinden. Kann auch ganz normal den Interfacebuilder für GUI zusammenklicken und alles benutzen.

    Ob es jetzt für Windows oder X11 was gibt kann ich dir nicht sagen. Da will ich aber ehrlichgesagt nichts mit GUI-Programmierung zu tuen haben :D.



  • @maximAl
    Es gibt einen GUI "Standard" für Common Lisp mit dem Namen CLIM bzw. McCLIM als freie Implementierung. Ist aber sehr gewöhnungsbedürftig. Ansonsten siehe http://www.cliki.net/Graphics Toolkit

    Die meisten Lispprogramme laufen ja eher im Hintergrund oder haben wohl mittlerweile wenn eher eine Webgui.



  • Also, ich hab mich nochmal etwas umgeschaut und bin denke ich auch fündig geworden.

    Zuerst fiel mein Augenmerk auf Bigloo, welches sich sowohl mit C als auch Java kombinieren lässt (und nebenbei ziemlich schnell sein soll). Allerdings muss man immernoch explizit angeben, welche Klasse und welche Funktionen man importieren will und das wird bei großen Frameworks kein Spass.
    Ein einfaches Fenster mit Swing sieht dann schon so aus:

    (module swing-example (main main)
       (java
         (class jstring
           (constructor new-string (::string))
           "java.lang.String")
         (class jframe
           (constructor new-default ())
           (constructor new-title (::jstring))
           (method set_visible::void (::jframe ::bool) "setVisible")
           (method set_title::void (::jframe ::jstring) "setTitle")
           (method set_size::void (::jframe ::int ::int) "setSize")
           (method set_default_close_operation::void (::jframe ::int) "setDefaultCloseOperation")
           (field static exit_on_close::int "EXIT_ON_CLOSE")
    	  "javax.swing.JFrame")))
    
    (define (main argv)
      (let*(
    	 (frame (jframe-new-default))
    	 (title (jstring-new-string "Hello from Bigloo"))
    	 (width 400)
    	 (height width))
        (jframe-set_default_close_operation frame jframe-exit_on_close)
        (jframe-set_title frame title)
        (jframe-set_size frame height width)
        (jframe-set_visible frame #t)
        (read-line)))
    

    Besser geeignet scheint mir kawa. Das ist womöglich nicht so schnell, aber die Einbindung von Swing (und wahrscheinlich auch SWT, für die, die ein ästhetisches Empfinden 🤡 besitzen) ist wirklich easy peasy, hier mal ein Swing Fenster mit Quit-Button in der Mitte:

    (define-namespace JFrame <javax.swing.JFrame>)
    (define-namespace JButton <javax.swing.JButton>)
    
    (define-simple-class <MyActionListener> (<java.awt.event.ActionListener>)
      ((actionPerformed e :: java.awt.event.ActionEvent) (exit)))
    
    (define (main argv)
      (let*(
    	 (frame :: JFrame (JFrame:new "Hello from kawa"))
    	 (width 400)
    	 (height width)
    	 (button :: JButton (JButton:new "Quit")))
        (invoke frame 'setDefaultCloseOperation JFrame:EXIT_ON_CLOSE)
        (invoke frame 'setSize width height)
        (invoke button 'addActionListener (<MyActionListener>:new))
        (invoke frame 'add button)
        (invoke frame 'setVisible #t)))
    
    (main "")
    


  • Clojure mal angeschaut?



  • Das hatte ich erstmal ausgeblendet, weils wohl doch etwas weiter von klassischen Lisps entfernt ist (eckige und geschweifte Klammern? Blasphemie! 😡 😉 ). Ich hatte auch irgendwo einen Artikel über Clojure gelesen, wo ein paar Sachen drin standen, die mir gar nicht gefallen hatten - leider weiss ich nicht mehr, was mir nicht gefallen hatte und ich finde den Link auch nicht mehr...
    Aber womöglich sollte ich dem ganzen noch einen Versuch geben.



  • maximAL schrieb:

    Gibts eigentlich ein Lisp (Common Lisp oder Scheme), welches eine vernünftige GUI Bibliothek bietet?

    Was für einen Compiler hast du? Die meisten guten Lisp-Compiler haben ein foreign function interface, und weil viele der Compiler C als Zielsprache verwenden, ist die Benutzung oft ein Kinderspiel.

    ZB ein GTK-Programm mit Gambit-C ( www.iro.umontreal.ca/~gambit/ ):

    ;; gambit-gtk.scm
    
    (c-declare #<<END
    
    #include <gtk/gtk.h>
    
    void show_window(void)
    {
        GtkWidget *window;
    
        gtk_init (0, NULL);
    
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_widget_show  (window);
    
        gtk_main ();
    }
    
    END
    )
    
    (define show-window
      (c-lambda ()
                void
        "show_window"))
    
    (show-window)
    

    Das kann man übersetzen mit

    gsc -c gambit-gtk.scm
    gsc -link gambit-gtk.c
    gcc gambit-gtk.c gambit-gtk_.c -o gambit-gtk -O2 -lm -ldl -lutil \
    -L/usr/local/Gambit-C/lib/ -lgambc `pkg-config --libs gtk+-2.0` \
    -I/usr/local/Gambit-C/include/ `pkg-config --cflags gtk+-2.0`
    

    Das ist schonmal recht nett.
    🙂



  • Warum will man denn GUIs mit Lisp bauen? Verstehe ich nicht. Da programmiert man doch auch nur wie in C. Mit den Grundprinzipien von Lisp wie Funktionen hoeherer Ordnung kann man da nur selten nutzen.


Anmelden zum Antworten