Erfahrungen mit Racket

Und von einem banalen send c focus, was ich auf die Schnelle nicht gefunden habe, zu schließen, das ich nicht programmieren könnte, ist wirklich maßlos überzogen.
Das hast Du völlig falsch verstanden, lieber ralli.
Es ging dabei gar nicht um Dein Posting.
Es ging um SICP vs. Racket Guide und darum, dass das SICP ja eher Konzepte behandelt und beim Guide es ja konkret um Racket geht und das wenn jemand (wie Du) halt schon lange programmiert, dass man dann beim Racket lernen da eher mit dem Guide anfängt als mit dem SICP, weil man so jemanden eben nicht noch erklären muss, was Bedingungen, Schleifen, Variablen usw. sind.

Nichtsdestotrotz hat es ja was Gutes. So bin ich zu Deinem interessanten Lebenslauf gekommen.
 
Ich entdecke immer Neues... es muß keine drracket.desktop Datei selbst erstellt werden, denn sie existiert nach einer racket Installation hier:

Code:
~/.racket/6.12/share/applications/drracket.desktop

Sie muß lediglich an den richtigen Ort kopiert werden:

Code:
/usr/local/share/applications

Im übrigen befindet sich oben auch eine Desktop Datei für die Slideshow slideshow.desktop
 
Ich entdecke immer Neues... es muß keine drracket.desktop Datei selbst erstellt werden, denn sie existiert nach einer racket Installation hier:

Code:
~/.racket/6.12/share/applications/drracket.desktop

Sie muß lediglich an den richtigen Ort kopiert werden:

Code:
/usr/local/share/applications

Im übrigen befindet sich oben auch eine Desktop Datei für die Slideshow slideshow.desktop

Kurzer Hinweis: Da Du Racket in deinem $HOME installiert hast, ist es sinnvoll, die``drracket.desktop'' auch nur diesem user zugaenglich zu machen. Hierfuer wuerde ich die ``drracket.desktop'' nach ``~/.local/share/applications/'' kopieren. Wenn Du natuerlich nur einen user auf dem Rechner hast, ist das im Prinzip egal. Der Korrektheit halber wuerde ich das dennoch so machen.
 
Das hast Du völlig falsch verstanden, lieber ralli.
Es ging dabei gar nicht um Dein Posting.
Es ging um SICP vs. Racket Guide und darum, dass das SICP ja eher Konzepte behandelt und beim Guide es ja konkret um Racket geht und das wenn jemand (wie Du) halt schon lange programmiert, dass man dann beim Racket lernen da eher mit dem Guide anfängt als mit dem SICP, weil man so jemanden eben nicht noch erklären muss, was Bedingungen, Schleifen, Variablen usw. sind.

Nichtsdestotrotz hat es ja was Gutes. So bin ich zu Deinem interessanten Lebenslauf gekommen.

Genau so (SICP vs. Racket Guide) habe ich es auch verstanden. ;-)

Dennoch ist SICP mehr als nur ein Buch fuer Anfaenger. Die ersten Kapitel sind schon eine Einfuehrung in oben erwaehnte Konzepte. Danach geht es aber durchaus ins Eingemachte und selbst erfahrene Programmierer koennen noch viel davon lernen.
 
Dennoch ist SICP mehr als nur ein Buch fuer Anfaenger. Die ersten Kapitel sind schon eine Einfuehrung in oben erwaehnte Konzepte. Danach geht es aber durchaus ins Eingemachte und selbst erfahrene Programmierer koennen noch viel davon lernen.
Das will ich gerne bestätigen. Mit jedem Kapitel wird es anspruchsvoller. Und ich lerne einige Dinge, die ich so nocht nicht sah. Ich glaube, ich habe auch irgendwo gelesen, das das ein Standardwerk für die IT ist. Und wenn ich sehe, wer da alles mitgearbeitet hat, dann ist es kein Wunder, das die Qualität außerordentlich gut ist.
 
Kurzer Hinweis: Da Du Racket in deinem $HOME installiert hast, ist es sinnvoll, die``drracket.desktop'' auch nur diesem user zugaenglich zu machen. Hierfuer wuerde ich die ``drracket.desktop'' nach ``~/.local/share/applications/'' kopieren. Wenn Du natuerlich nur einen user auf dem Rechner hast, ist das im Prinzip egal. Der Korrektheit halber wuerde ich das dennoch so machen.
Bei mir gibt es nur mich als User, aber trotzdem Danke für den Tipp.:)
 
Kurzer Hinweis: Da Du Racket in deinem $HOME installiert hast, ist es sinnvoll, die``drracket.desktop'' auch nur diesem user zugaenglich zu machen. Hierfuer wuerde ich die ``drracket.desktop'' nach ``~/.local/share/applications/'' kopieren. Wenn Du natuerlich nur einen user auf dem Rechner hast, ist das im Prinzip egal. Der Korrektheit halber wuerde ich das dennoch so machen.
Und das habe ich gerade angepaßt. Korrekt sollte es sein, so viel Zeit muß sein.:)

Aber zu meiner Schande muß ich gestehen, das mir entgangen war, das es auch im Homeverzeichnis einen Ordner applications gibt ... sehr aufmerksam @midnight, wieder was gelernt von Dir. Danke dafür.:)
 
Auch mit der Ein- und Durcharbeitung der Basics komme ich gut voran. Racket gefällt mir immer besser. Auch Drracket ist wirklich gut für die Fehlersuche und Debugging. Natürlich habe ich die GUI Programmierung auch nicht vernachlässigt. Mein Editor namens dokumaker ist (fast) fertig. Er erstellt html und PDF Dokus und erleichtert das Handling mit scribble, weil es einige Tipparbeit erspart. Ich muß noch einige kleinere Sachen einbauen, wie zum Beispiel, die Abfrage, ob gespeichert werden soll, wenn dokumaker verlassen und Quelltext verändert wurde. Wenn der dokumaker ganz fertig ist, werde ich ihn hier veröffentlichen und vorstellen, wenn Bedarf besteht. Es gibt eine kleine Liste für die nächsten GUI Projekte, ganz oben steht der OcrMaker, ein Editor, mit dem man Text einscannen und mit tesseract erkennen und weiter verarbeiten kann. Und dann werde ich mich an einem kleinen Programm für das Brennen einer CD heranwagen. Es bleibt viel zu tun und spannend. Und ich bin froh, das ich von QT weg bin, was sich zu einen Moloch entwickelt hat. Zu guter letzt werde ich mir die Datenanbindung vornehmen und schauen, ob mit Racket GUI ein Datenbankfrontend für sqlite verwirklicht werden kann. Die Vielseitigkeit von Racket ist für mich faszinierend, es deckt vieles ab und ist damit universal einsetzbar.
 
. Mein Editor namens dokumaker ist (fast) fertig. Er erstellt html und PDF Dokus und erleichtert das Handling mit scribble, weil es einige Tipparbeit erspart. Ich muß noch einige kleinere Sachen einbauen, wie zum Beispiel, die Abfrage, ob gespeichert werden soll, wenn dokumaker verlassen und Quelltext verändert wurde. Wenn der dokumaker ganz fertig ist, werde ich ihn hier veröffentlichen und vorstellen, wenn Bedarf besteht.
Klingt auf jeden Fall interessant.

Es gibt eine kleine Liste für die nächsten GUI Projekte, ganz oben steht der OcrMaker, ein Editor, mit dem man Text einscannen und mit tesseract erkennen und weiter verarbeiten kann. Und dann werde ich mich an einem kleinen Programm für das Brennen einer CD heranwagen.
Die Projekte gehen Dir nicht so schnell aus. :-)

Und ich bin froh, das ich von QT weg bin, was sich zu einen Moloch entwickelt hat.
Wobei ich eher das Problem bei Qt immer sah, dass man ja nicht direkt C++ schreibt, sondern ja eigentlich Qt C++ was dann erst in C++ umgewandelt wird.
Das ermöglichte einfache Entwicklung. C++ hat sich aber halt auch weiter entwickelt, so dass man heute vielleicht einen anderen Ansatz wählen würde der sich besser in C++ direkt integriert was ich als angenehmer empfinden würde.
 
Wobei ich eher das Problem bei Qt immer sah, dass man ja nicht direkt C++ schreibt, sondern ja eigentlich Qt C++ was dann erst in C++ umgewandelt wird.

Das geht mir tatsächlich auch so. Das hat auch dafür gesorgt, dass man Qt-Anwendungen z.B. nicht einfach in Visual Studio entwickeln kann, sondern diesen grauenvollen Qt Creator benutzen muss*. Deswegen habe ich nie eine Qt-Anwendung entwickelt...

(Mal abgesehen von der Lizenz, die bedingt, dass ich unter Windows pro Anwendung ungefähr 574.396 zusätzliche DLLs ausliefern müsste.)


*: Das sind meine Erfahrungen von vor fünf-oder-so Jahren. Vielleicht gibt es inzwischen eine vernünftige Integration in Visual Studio 2017, dann nehme ich das zurück.
 
Das geht mir tatsächlich auch so. Das hat auch dafür gesorgt, dass man Qt-Anwendungen z.B. nicht einfach in Visual Studio entwickeln kann
Ich würde mal behaupten, dass gibt es schon länger.
Aktuell findet sich das unter:
https://wiki.qt.io/Visual_Studio_Add-in

(Mal abgesehen von der Lizenz
Apropos Lizenz. Racket strebt ja an von der LGPL zur MIT-License zu wechseln fällt mir da noch ein.
 
Theoretisch. Praktisch lief das unter VS 2013 (?) nie so richtig
Dazu kann ich auch nix sagen. Ich wollte auch nur lediglich darauf hinweisen, dass es (inzwischen) ein offizielles Projekt dazu gibt.

Sollte das nicht völlig unerheblich sein?
Das fiel mir nur gerade ein, weil wir ja in einem Racket-Thread sind.
Abgesehen davon ist es nicht zwangsläufig unerheblich. Also für den reinen Compiler sicher schon, aber man benutzt ja üblicherweise auch viele Bibliotheken. Und dann kann die LGPL ein Problem sein. Nämlich wenn Du an einer LGPL-Bibliothek etwas verändert hast aber diese Änderungen nicht offen legen willst.

Und hier geht der Bogen auch wieder zurück zu Qt. Das gibt es ja auch in LGPL. Was Du dann halt nicht darfst ist z.B. statisch linken weshalb Du ja gezwungen bist (wie von Dir ausgeführt) ne ganze Horde an DLL-Dateien mitzuliefern.

In bezug auf Racket ist halt die Frage, inwieweit das erzeugen eines Standalone-Executables als "statisches linken" gezählt werden kann oder nicht. Falls ja, wäre auch ohne Änderung an den Racket-Bibliothken die LGPL ein Problem.

Mit einem Switch zur MIT-Lizenz hätte man solche Fragestellungen alle mit einem Schlag vom Tisch.
 
Die erste Version von DokuMaker mit Racket GUI programmiert, ist fertig. Bei mir funktioniert sie bereits fehlerfrei. Es lassen sich HTML und PDF Dokus erstellen. PDF natürlich nur, wenn das Paket texlive_mf-full unter OpenBSD installiert ist. Ich habe viel bei der Erstellung gelernt. Aber ich werde es noch weiter verbessern, ganz zufrieden bin ich noch nicht. Insbesondere speichert er die srcbl Dateien immer ins Homeverzeichnis, dort wird auch die Doku erstellt. In einer zukünftigen Version soll er die erstellte srcbl Datei in dem Verzeichnis speichern, aus dem DokuMaker gestartet wurde. Ich habe noch nicht herausgefunden, welche Funktion dafür genommen werden muß. Oder das er vor dem Beenden merkt, das der Text verändert wurde und den Speicherdialog anbietet. Auch die messagebox mit der yes/no Abrage funktioniert noch nicht. Aber das Programm arbeitet ansonsten bei mir schon fehlerfrei. Ich hänge hier die Datei dm.txt an, die wie immer umbenannt werden muß in dm.rkt. Wer Fehler findet, darf sie behalten.;) Aber im ernst, Verbesserungsvorschläge sind immer willkommen. Und ich werte das als ersten Erfolg und bin motiviert, mit racket weiter zu arbeiten.

have fun :)

dokumaker.png
 

Anhänge

  • dm.txt
    5,3 KB · Aufrufe: 299
Die erste Version von DokuMaker mit Racket GUI programmiert, ist fertig.
Ja. Und er sieht schon ziemlich gut aus. *Daumen_hoch*

einer zukünftigen Version soll er die erstellte srcbl Datei in dem Verzeichnis speichern, aus dem DokuMaker gestartet wurde.
(current-directory)
Dürfte Dir da helfen:
http://docs.racket-lang.org/referen...._((quote._~23~25kernel)._current-directory))

Oder das er vor dem Beenden merkt, das der Text verändert wurde und den Speicherdialog anbietet.
Das Problem ist evtl. , dass man das Programm ja auch via "Kreuz" beendet werden kann.
on-close könnte Dir da evtl. weiterhelfen:
http://docs.racket-lang.org/gui/top....rkt)._top-level-window~3c~25~3e)._on-close))

Dafür musst Du Deinen "frame" anpassen:
Code:
(define frame
  (new (class frame% (super-new)
         (define/augment (on-close)
          ; Hier muss Du tun was gemacht werden muss, bevor
          ; das Programm geschlossen wird
           ))
       [label "DokuMaker"] [width 900] [height 700]))

Auch die messagebox mit der yes/no Abrage funktioniert noch nicht.
Stimmt. Aber das ist eigentlich gar nicht so schwer, da die Funktion message-box ein Symbol für den angeklickten Button zurückgibt::
Code:
(new menu-item%
         [label "Beenden"]
         [parent m-file]
         [callback
          (lambda (b e)
           (when (equal? 'yes (message-box "DokuMaker beenden" "Möchten Sie wirklich beenden?" #f '(yes-no)))
             (send frame show #f)))]))

Aber das Programm arbeitet ansonsten bei mir schon fehlerfrei.
Ich hab auch nur einen Bug entdeckt. Oder wohl eher ein Tippfehler.

In Zeile 194 ist ein Klammerpaar zuviel. Es müsste statt
((send dialog show #true)))])
eher:
(send dialog show #true))])
heißen.

Verbesserungsvorschläge sind immer willkommen.
Hm. Ist zwar Spielerei, aber man könnte ein Makro schreiben, was die Definition der Menüs etwas vereinfacht:
Code:
(define-syntax-rule (create-menuitem par lbl cbk)
  (new menu-item%
       [label lbl]
       [parent par]
       [callback
        (lambda (b e)
          cbk)]))

Dann kann man statt
Code:
(new menu-item%
         [label "Rückgängig"]
         [parent m-edit]
         [callback
          (lambda (b e)
           (send text-editor undo))])

(new menu-item%
         [label "Wiederholen"]
         [parent m-edit]
         [callback
          (lambda (b e)
           (send text-editor redo))])
usw. es übersichtlicher so schreiben:
Code:
(create-menuitem m-edit "Rückgängig" (send text-editor undo))
(create-menuitem m-edit "Wiederholen" (send text-editor redo))
usw.

Wie gesagt. Vielleicht an der Stelle eher Spielerei, aber ein leichter Einstieg in das Thema Makros. Also Compile-Time-Code.
 
Danke Andy für das kompetente Feedback. Deine Verbesserungsvorschläge werde ich durcharbeiten. Natürlich interessiert mich das mit den Macros, weil es die Sache nicht nur vereinfacht, sondern der Code auch lesbarer wird. Noch eine kleine Frage sei mir erlaubt. In welcher Variable befindet sich eigentlich der ausgewählte oder benutzte Filename, wenn

Code:
(define path (get-file #f frame))

oder

Code:
(send text-editor save-file #f 'text))]

für die Dialoge benutzt wird? Danke! Das mit dem Klammerpaar habe ich korrigiert, das stimmt.Das seltsame ist, das er das nicht angemeckert hat und es trotzdem läuft. Ansonsten steh ich ja erst am Anfang und habe noch viel zu lernen.:)

Und das Beenden funktioniert dank Deiner Unterstützung und Hilfe jetzt auch einwandfrei, ich bin begeistert!:) Leider sind die yes/no Buttons in englisch, läßt sich das auch beheben, denn es wäre schöner, wenn die mit Ja/Nein beschriftet wären?
 
n welcher Variable befindet sich eigentlich der ausgewählte oder benutzte Filename .....
Ich verstehe Deine Frage zwar nicht ganz, versuche aber dennoch zu antworten. :-)

(define path (get-file #f frame))
Falls eine Datei ausgewählt wird, so wird sie in path gespeichert. Ansonsten landet in path ein #f (False).
Übrigens wird alles andere als #f generell als #t (True) interpretiert.
Du kannst also schreiben:
Code:
(when path
         (speichern path))

(send text-editor save-file #f 'text))]
Hier musst Du natürlich den ermittelten Dateinamen mit angeben:
(send text-editor save-file path 'text)

Wenn man das alles zusammenfügt, erhält man:
Code:
(define path (get-file #f frame))
(when path
  (send text-editor save-file path 'text))

Nun will man natürlich nicht bei jedem Mal speichern nach dem Dateinamen fragen müssen. Nach dem ersten Mal ist er ja auch eigentlich bekannt.
Du könntest ihn dann in einer Variablen speichern die Du mit #f initialisierst.
Ist sie beim Speicherversuch #f dann rufst Du halt den get-file-Dialog auf. Ansonsten kannst Du halt direkt speichern.

Ich hoffe, unter dem ganzen Geschreibsel war jetzt die Antwort auf Deine Frage dabei. :-)

Das mit dem Klammerpaar habe ich korrigiert, das stimmt.Das seltsame ist, das er das nicht angemeckert hat und es trotzdem läuft.
Syntaktisch ist das ja auch alles korrekt. Allenfalls zur Laufzeit fällt es auf.

Leider sind die yes/no Buttons in englisch, läßt sich das auch beheben, denn es wäre schöner, wenn die mit Ja/Nein beschriftet wären?
Ich weiß jetzt aus dem Stand gar nicht, ob message-box eine Möglichkeit der Lokalisierung vorsieht. Was natürlich immer geht ist message-box/custom zu verwenden.
Code:
(when (= (message-box/custom "DokuMaker beenden" "Möchten Sie wirklich beenden?" "Ja" "Nein" #f)
         1)
    (send frame show #f))
 
Ich spendiere den OpenBSD Fans mal ein kleines Utilitie. Es mountet und unmountet CD in den Ordner /mnt und zeigt sie im Dateimanager Caja an. Außerdem kann es die CD auswerfen. Arbeitszeit mit Racket GUI 10 Minuten.

mounter.png
 

Anhänge

  • mounter.txt
    1,1 KB · Aufrufe: 280
Danke! Gut, das Programm kann jetzt keinen Schönheitspreis gewinnen, aber es erfüllt seinen Zweck.:) Denn das ist das nächste, was ich mir vorknöpfe, das Layouten, Wie Buttons oder Widget positioniert und angeordnet werden im Elternwidget, oder wie Buttons die gleiche Größe erhalten. Und der Screenshot ist bei mir normal, allerdings mit 144 DPI, Im Forum ist das viel größer. Egal, ich wollte nur aufzeigen, wie ohne großen Zeitaufwand schnell ein Helferlein mit Racket GUI geproggt wird. Das nächste wird ein kleines Brennprogramm für CD's. Im übrigen ist der OcrMaker auch fertig und einsatzbereit. Damit kann eine Seite gedrucker Text auf den Scanner gelegt und eingescannt und dann mit tesseract OCR erkannt und in beartbeiten Text zurück verwandelt werden.
 
Zuletzt bearbeitet von einem Moderator:
Gut, das Programm kann jetzt keinen Schönheitspreis gewinnen
Kein Problem.
Wir sind ja hier auch nicht bei MacOS, sondern BSD.

Das nächste wird ein kleines Brennprogramm für CD's. Im übrigen ist der OcrMaker auch fertig und einsatzbereit. Damit kann eine Seite gedrucker Text auf den Scanner gelegt und eingescannt und dann mit tesseract OCR erkannt und in beartbeiten Text zurück verwandelt werden.
Bald kann ich alle Tools durch Ralli-Tools ersetzen. Cool :cool:
 
Zurück
Oben