Lisp
-
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.
-
knivil schrieb:
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.
Obwohl GUI's eigentlich voll sind von Callbacks, da wäre eine funktionale Sprache doch nett. Und Spaghetticode, den GUI's so gerne haben, könnte man dann auch einfacher generieren lassen.
-
knivil schrieb:
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.
Nicht alle Programme mit nem GUI bestehen nur aus banalen Eingabemasken.
Zudem interessiert mich Lisp primär für DSLs und das kann auch für komplexe GUIs sehr nützlich sein.
-
Nicht alle Programme mit nem GUI bestehen nur aus banalen Eingabemasken.
Ich wuerde das "banal" weglassen. Aber fuer mich sind es nur Eingabe/Darstellungsmasken. Alles andere wuerde dem Model-View-Controller-Prinzip zuwiderlaufen.
-
knivil schrieb:
Nicht alle Programme mit nem GUI bestehen nur aus banalen Eingabemasken.
Ich wuerde das "banal" weglassen. Aber fuer mich sind es nur Eingabe/Darstellungsmasken. Alles andere wuerde dem Model-View-Controller-Prinzip zuwiderlaufen.
Wenn du nicht gleich eine Client-Server Anwendung bauen willst, bleibt dir aber nicht viel übrig, als entweder alles in einer 08/15 Sprache zu schreiben oder alles in Lisp etc.
Und da bei meinen Projekten die meisste Arbeitszeit nicht in die GUI an sich sondern in den ganzen Unterbau geflossen ist, wäre ein mächtigere Sprache schon eine feine Sache.
-
maximAL schrieb:
Wenn du nicht gleich eine Client-Server Anwendung bauen willst, bleibt dir aber nicht viel übrig, als entweder alles in einer 08/15 Sprache zu schreiben oder alles in Lisp etc.
Gar nicht wahr. Was hast du gegen die Scheme->C-Compiler?
-
mngbd schrieb:
maximAL schrieb:
Wenn du nicht gleich eine Client-Server Anwendung bauen willst, bleibt dir aber nicht viel übrig, als entweder alles in einer 08/15 Sprache zu schreiben oder alles in Lisp etc.
Gar nicht wahr. Was hast du gegen die Scheme->C-Compiler?
Was hast du gegen die Scheme->Java Compiler?
Genau darum gehts hier doch.
Und ich such(t)e ein Lösung, wo das ohne hässliches Binding-Gefrickel geht, sondern sich möglichst natürlich einbinden lässt.