Scheme (chicken)

rubricanis

Homo ludens
Ich bin zwar von racket ziemlich beeindruckt, habe aber den Eindruck das es so etwas wie eine Eierlegendewollmilchsau ist. Das soll keine Kritik sein, das Gegenteil ist der Fall, insbesondere DrRacket ist prima! Ich werde mich allerdings bis auf weiteres (!) zum lernen von Scheme auf #lang r5rs begrenzen. Ich neige ein wenig zu Minimalismus...

Als std Scheme gibt es einige Alternativen. Ich denke chicken ist aus stabilitäts, portabilitäts und runtime Gründen vermutlich recht gut geeignet da es zu C kompiliert. Außerdem habe ich mir schon länger vorgenommen IUP als GUI auszuprobieren.

Die Installation als package oder aus den sources sollte unter linux/bsd keinerlei Probleme verursachen. Unter Win10 ist das bei solchen Sachen oft recht haklig, so auch hier. Das auch weil die Beschreibungen etwas konfuss sind. Es gibt auch für Windows verschiedene Prebuilds aber deren Installation schien mir die Sache erher zu komplizieren als zu vereinfachen. Ich notier hier einmal die Schritte für die Installation unter Win10 aus den sources.

(1) Man braucht mitgw-64 zum kompilieren. Die Installation macht keierlei Probleme. Es empfielt sich allerdings mingw_32_make in make umzubenennen. C:\Program Files\MingW\mingw32\bin muss natürlich auch in den Pfad.

(2) Chicken herunterladen und entpacken.

(3) Mit cmd.exe in den downlod ordner wechseln.

(4) Kompilieren:
Code:
make PLATFORM=mingw PREFIX=<destdir>  ARCH=x86-64
Ohne ARCH funktioniert das nicht! Kompletten Pfad von C: in <destdir> angeben, mit '/', also nicht '\\'. Ich installiere solche Sachen immer im home verzeichnis.

(5) Installieren:
Code:
make PLATFORM=mingw install

Enjoy!
 
Hier können sich Interessierte einen Überblick verschaffen:

chicken/scheme

Wer C gewöhnt ist, wird mit der Syntax schnell vertraut sein. Ganz sicher auch nicht uninteressant. Wenn ich mit Racket fertig bin und das gut beherrsche, werde ich mir chicken/scheme genauer ansehen, denn dann erst kann ich vergleichen, was mir besser liegt.
 
Hat mich jetzt trotzdem angefixt....

Unter OpenBSD chicken installieren:

Code:
pkg_add chicken

Für einen ersten Test erstellen wir mit einem Editor unserer Wahl das traditionelle Hallo Welt die Datei hello-world.scm:

Code:
;;; hello-world.scm
(print "Hello, world!")

Start mit dem Interpreter aus der Konsole

Code:
csi -s Hallo-Welt.scm

Ergebnis: Hello, world!

Compilieren und starten als ausführbares binary:

Code:
csc hello-world.scm

starten in der Konsole:

Code:
./hello-world

Ergebnis: Hello, world!

Ein erste Erfolgserlebnis, es funktioniert.:)

Die Nähe zu C macht chicken/scheme zu einer durchaus interessanten Alternative zu racket. Werde zwischendurch mich mal ein Stück weit etwas weiter einarbeiten, dabei racket aber nicht vernachlässigen.
 
Die Nähe zu C macht chicken/scheme zu einer durchaus interessanten Alternative zu racket
Yep! Ich habe inzwischen unter Win10 einige libs (eggs) installiert und das läuft prima. Macht alles einen soliden Eindruck. Leider gilt das nicht für IUP (GUI) aber darum werde ich mich später kümmern. Ist natürlich alles ein wenig komplizierter als unter racket, aber nicht allzusehr (modules, compiler, libs). Erfordert noch ein wenig Einarbeitungszeit von der ich z.Z. leider nicht allzuviel habe. Ob das sinn macht sich in beide einzuarbeiten bezweifele ich inzwischen eher. Ich neige da wohl eher zu chicken.

@ralli: Kannst du evtl mal versuchen das IUP egg zu installieren? (man, tutorial)
Code:
chicken-install iup
 
@ralli: Kannst du evtl mal versuchen das IUP egg zu installieren? (man, tutorial)
Endet leider mit Fehler:

Code:
iup.c:13:10: fatal error: 'callback.h' file not found
#include <callback.h>
         ^~~~~~~~~~~~
1 error generated.

Error: shell command terminated with non-zero exit status 256: 'cc' 'iup.c' -o 'iup.o' -c  -DHAVE_CHICKEN_CONFIG_H -O2 -pipe -fPIC -DPIC -DC_SHARED -I/usr/local/include/chicken

Error: shell command failed with nonzero exit status 256:

  '/usr/local/bin/csc' -feature compiling-extension -setup-mode    -s -O2 -d1 iup.scm -j iup -j iup-base -j iup-controls -j iup-dialogs -j iup-glcanvas -j iup-glcontrols -j iup-plot -j iup-mglplot -j iup-pplot -j iup-scintilla -j iup-web -j iup-config -lcallback -liup -liupim -liupimglib -liupcontrols -liupmatrixex -liupgl -liupglcontrols -liup_plot -liup_mglplot -liup_pplot -liup_scintilla -liupweb


Error: shell command terminated with nonzero exit code
17920
"'/usr/local/bin/csi' -bnq -setup-mode -e \"(require-library setup-api)\" -e \"(...
 
Oben ist mir ein Fehler unterlaufen.

Zum compilieren muß es natürlich heißen:

Code:
csi -s hello-world.scm

und nicht:

Code:
csi -s Hallo-Welt.scm

Im übrigen tritt der gleiche Fehler unter FreeBSD auch auf!
 
Ich bin zwar von racket ziemlich beeindruckt, habe aber den Eindruck das es so etwas wie eine Eierlegendewollmilchsau ist. Das soll keine Kritik sein, das Gegenteil ist der Fall, insbesondere DrRacket ist prima! Ich werde mich allerdings bis auf weiteres (!) zum lernen von Scheme auf #lang r5rs begrenzen. Ich neige ein wenig zu Minimalismus...
Und genau das liebe ich an Racket, die Vielfalt. Es ist wirklich universal einsetzbar. Selbst Datenbankprogrammierung ist möglich. Und mit scribble gibt es dann auch noch ein mächtiges Dokumentationswerkzeug. Aber so hat jeder seine Sichtweise und das ist auch gut und richtig so.:) Weiter vertiefen möchte ich das jetzt nicht .....
 
Der Minimalismus der diversen Schemes hatte mich ursprünglich zu Common Lisp gebracht. Ich will, wenn ich Software schreibe, die eventuell auch anderen Leuten von Nutzen sein könnte, kein README schreiben müssen, das drei Bildschirmseiten lang die Abhängigkeiten auflistet. Für dieses Bedürfnis habe ich schon C++ im Portfolio. :ugly:
 
IUP ist erstaunlich gut, bedenkt man, dass da wohl keine Finanzierung drinsteckt (scheint ein Abfallprodukt einer Hochschule zu sein?). Unter Lisp habe ich es aber noch nie benutzt.
Aber nur, wenn es sich installieren läßt und läuft, und das ist bei @rubricanis und mir nachweislich nicht der Fall. Und zwar betrifft das Windows 10, FreeBSD und OpenBSD. Und bei Dir läuft es und Du hast es in Betrieb?
 
Was beim installieren Probleme macht ist ja nicht IUP sondern die bindings. Und vermutlich liegt das an irgendeiner Kleinigkeit die man einfach wissen muss, vielleicht auch an der Doku. Ist mir im Moment nicht wichtig, sonst würde ich das weiter verfolgen. Aber ich gebe zu: Es ärgert mich immer wenn so etwas nicht aus dem Stand funktioniert. Chicken scheint nicht gemacht um Anfänger wie uns baldmöglichst glücklich zu machen, sondern für Leute die wissen was sie tun...

Ein weiterer Aspekt ist das das teilweise auf einen edit-compile-run cyklus hinausläuft was natürlich viele Optionen für die Kompilation eröffnet. Das läuft dann auf Makefiles hinaus (die ich hasse). Zwar gibt es ein tool (system) das aber recht komplex erscheint und für mich noch (!) weitgehend undurchsichtig. Klar, große Teile der Entwicklung können innerhalb der REPL gemacht werden, aber eben nicht alle. Racket ist für den Anfang mit Sicherheit weit einfacher. Wir werden sehen...
 
Die Docu von chicken ist zwar recht umfangreich, aber als Anfänger muss man sich die relevanten Komponenten erst zusammensuchen was nicht so ganz einfach ist. Als build-tool fungiert hier die system lib. Damit werden entweder objekt files oder shared libs generiert, praktisch ein bequemeres Äquivalent zu gmake. Um die generierte shared lib vom interpreter (csi) aufzurufen braucht man dann noch einen kleinen Wrapper. Hier mal den Code für ein simples Beispiel mit dem sinnigen Namen "wings".

Modul definition:
Code:
;;; src/run.scm
(module wings (run)
  (import scheme)
  ;; imports r5rs und r7rs

  ;; public function
  (define (run)
    (display "Hello World")
    (newline)) )

Auf dem Toplevel die system definition:
Code:
;;; wings.scm
(define-system wings
    (scheme-file "src/run")
    (compiled-scheme-file "src/run"))
sowie den starter:
Code:
;;; start.scm
(use system system)
(build-system wings)
(import wings)
(run)
(newline)
Aufruf:
Code:
$ csi
#;1> (load "start.scm")
Generiert wird "src/run.so" sowie eine interface definition "wings.import.scm"

Das ist in etwa das setup während der Enwicklung. Natürlich werden wie bei make nur geänderte Dateien neu kompiliert. Installation und Deployment läuft dann etwas anders.
 
Die Docu von chicken ist zwar recht umfangreich, aber als Anfänger muss man sich die relevanten Komponenten erst zusammensuchen was nicht so ganz einfach ist. Als build-tool fungiert hier die system lib. Damit werden entweder objekt files oder shared libs generiert, praktisch ein bequemeres Äquivalent zu gmake. Um die generierte shared lib vom interpreter (csi) aufzurufen braucht man dann noch einen kleinen Wrapper. Hier mal den Code für ein simples Beispiel mit dem sinnigen Namen "wings".
Ähnlich wie bei Racket. Manchmal kann ich nur den Kopf schütteln, warum einfach, wenn es auch kompliziert geht?;) Für mich ist die Qualität der Dokumentation mit ausschlaggebend, wenn ich mich für eine Sprache entscheide. SInd ausreichend Beispiele vorhanden, aus denen ich lernen kann? Fehlt das, dann sind es Zeiträuber, wenn ich, wie bei meinem kleinen Beispiel mit dem Editor ersichtlich, mir alles mühselig im Netz zusammen suchen muß.
 
Ich denke solche größeren, nicht kommerziellen Projekte werden eher dezentral, verteilt auf eine größere Zahl von Leuten entwickelt. Und Dokus schreiben gehört ja nicht zu den beliebtesten Tätigkeiten für Programmierer. Technische Dokumentation ist zudem ein generelles Problem, nicht nur hier. Mit so etwas muss man leben. Mailing-Listen oder Foren können hier helfen...
 
Ich denke solche größeren, nicht kommerziellen Projekte werden eher dezentral, verteilt auf eine größere Zahl von Leuten entwickelt. Und Dokus schreiben gehört ja nicht zu den beliebtesten Tätigkeiten für Programmierer. Technische Dokumentation ist zudem ein generelles Problem, nicht nur hier. Mit so etwas muss man leben. Mailing-Listen oder Foren können hier helfen...
Da stimme ich Dir generell zu, es ist ja kein Problem oder Alleinstellungsmerkmal von chicken/scheme .....;)
 
So, ich bin den Problemen mit IUP unter chicken auf die Schliche gekommen. Zunächst muss man iup in C kompilieren (was wie jedes gui toolkit je nach Platform etwas problematisch sein kann). Da ich z.Z. unter windows mingw_64 verwende (wird von chicken verwendet) müßte ich mich da erst mal reinfinden. Eine weiter Voraussetzung für die Bindings ist ffcall, eine kleine lib die callbacks C -> Scheme ermöglicht und ebenfalls in C compiliert werden muss. Zwar geht das in chicken auch ohne ffcall lib, aber der Verfasser der Bindings hatte wohl portabilität zu anderen Scheme-Dialekten im Sinn.

Werde ich wohl irgendwann machen, aber z.Z. gibt es noch genug anderes. Zu iup unter chicken gibt es noch ein nettes, kleines Tutorial.

PS: Wie ich gerade feststelle hat der Verfasser der Bindings die iup lib als obsolet eingeordnet. :-( Ich weiss nicht warum, vermutlich eine zu alte iup Version.
 
Zurück
Oben