Nach oben: Anleitungen zu Scheme [Inhalt][Index]
Die von Guix benutzte Scheme-Implementierung nennt sich Guile. Um mit der
Sprache herumspielen zu können, installieren Sie Guile mit guix
install guile
und starten eine interaktive Programmierumgebung (englisch
Read-Eval-Print-Loop, kurz REPL), indem Sie guile
auf der
Befehlszeile ausführen.
Alternativ können Sie auch den Befehl guix shell -- guile
ausführen,
wenn Sie Guile lieber nicht in Ihr Nutzerprofil installieren wollen.
In den folgenden Beispielen stehen die Zeilen dafür, was Sie auf der REPL eintippen; wenn eine Zeile mit „⇒“ beginnt, zeigt sie das Ergebnis einer Auswertung, während Zeilen, die mit „-|“ beginnen, für eine angezeigte Ausgabe stehen. Siehe Using Guile Interactively in das Referenzhandbuch zu GNU Guile für mehr Details zur REPL.
#true
und #false
(abgekürzt
auch #t
und #f
) jeweils für die Booleschen Werte „wahr“ und
„falsch“.
Beispiele für gültige Ausdrücke
"Hallo Welt!" ⇒ "Hallo Welt!" 17 ⇒ 17 (display (string-append "Hallo " "Guix" "\n")) -| Hallo Guix! ⇒ #<unspecified>
lambda
-Term deklariert:
Die obige Prozedur liefert das Quadrat ihres Arguments. Weil alles ein
Ausdruck ist, liefert der Ausdruck lambda
eine anonyme Prozedur, die
wiederum auf ein Argument angewandt werden kann:
((lambda (x) (* x x)) 3) ⇒ 9
Prozeduren sind normale Werte wie Zahlen, Zeichenketten, Boolesche Ausdrücke und dererlei auch.
define
ein globaler Name zugewiesen werden:
(define a 3) (define quadrat (lambda (x) (* x x))) (quadrat a) ⇒ 9
(define (quadrat x) (* x x))
list
-Prozedur erzeugt werden:
(list 2 a 5 7) ⇒ (2 3 5 7)
(srfi
srfi-1)
Standardprozeduren zur Verfügung (siehe Listenverarbeitung in Referenzhandbuch zu GNU Guile). Hier ein kurzer
Überblick:
(use-modules (srfi srfi-1)) ;Prozeduren zur Listenverarbeitung importieren (append (list 1 2) (list 3 4)) ⇒ (1 2 3 4) (map (lambda (x) (* x x)) (list 1 2 3 4)) ⇒ (1 4 9 16) (delete 3 (list 1 2 3 4)) ⇒ (1 2 4) (filter odd? (list 1 2 3 4)) ⇒ (1 3) (remove even? (list 1 2 3 4)) ⇒ (1 3) (find number? (list "a" 42 "b")) ⇒ 42
Beachten Sie, dass das erste Argument an map
, filter
,
remove
und find
eine Prozedur ist!
'(display (string-append "Hallo " "Guix" "\n")) ⇒ (display (string-append "Hallo " "Guix" "\n")) '(2 a 5 7) ⇒ (2 a 5 7)
quasiquote
-Zeichen (`
) wird die Auswertung eines
geklammerten Ausdrucks so lange abgeschaltet, bis ein unquote
(ein
Komma) sie wieder aktiviert. Wir können damit genau steuern, was ausgewertet
wird und was nicht.
`(2 a 5 7 (2 ,a 5 ,(+ a 4))) ⇒ (2 a 5 7 (2 3 5 7))
Beachten Sie, dass obiges Ergebnis eine Liste verschiedenartiger Elemente
ist: Zahlen, Symbole (in diesem Fall a
) und als letztes Element
selbst wieder eine Liste.
quasiquote
und unquote
haben: #~
(oder gexp
) und #$
(oder
ungexp
). Mit Ihnen kennzeichnen Sie, welcher Code erst später
ausgeführt werden soll („Code-Staging“).
G-Ausdrücke begegnen Ihnen etwa in manchen Paketdefinitionen, wo sie eingesetzt werden, damit Code erst bei der Erstellung des Pakets abläuft. Das sieht so aus:
(use-modules (guix gexp) ;für’s Schreiben von G-Ausdrücken (gnu packages base)) ;für 'coreutils' ;; Folgender G-Ausdruck enthält später ausgeführten Code. #~(begin ;; 'ls' aufrufen aus dem Paket, das in der Variablen 'coreutils' ;; definiert ist. (system* #$(file-append coreutils "/bin/ls") "-l") ;; Das Ausgabeverzeichnis des aktuell definierten Pakets anlegen. (mkdir #$output))
Siehe G-Ausdrücke in Referenzhandbuch zu GNU Guix für Details zu G-Ausdrücken.
let
benutzen (siehe Local Bindings in Referenzhandbuch zu GNU Guile):
(define x 10) (let ((x 2) (y 3)) (list x y)) ⇒ (2 3) x ⇒ 10 y error→ In procedure module-lookup: Unbound variable: y
Benutzen Sie let*
, damit spätere Variablendeklarationen auf frühere
verweisen können.
#:
(Doppelkreuz und Doppelpunkt) vorangestellt, gefolgt von alphanumerischen
Zeichen: #:etwa-so
. Siehe Keywords in Referenzhandbuch zu
GNU Guile.
%
wird in der Regel für globale Variable auf
Erstellungsebene benutzt, auf die nur lesend zugegriffen werden
soll. Beachten Sie, dass es sich dabei nur um eine Konvention handelt,
ähnlich wie _
in C. Scheme behandelt %
genau wie jedes andere
Zeichen.
define-module
erzeugt (siehe
Creating Guile Modules in Referenzhandbuch zu GNU Guile). Zum
Beispiel definiert man mit
(define-module (guix build-system ruby)
#:use-module (guix store)
#:export (ruby-build
ruby-build-system))
das Modul guix build-system ruby
, das sich unter dem Pfad
guix/build-system/ruby.scm innerhalb irgendeines Verzeichnisses im
Guile-Ladepfad befinden muss. Es hat eine Abhängigkeit auf das Modul
(guix store)
und exportiert zwei seiner Variablen, ruby-build
und ruby-build-system
.
Siehe Paketmodule in Referenzhandbuch zu GNU Guix für Informationen zu Modulen, in denen Pakete definiert werden.
Vertiefung: Die Sprache Scheme wurde oft eingesetzt, um Programmieren beizubringen, daher gibt es ein breites Angebot an Lehrmaterialien, die sie als Transportmittel einsetzen. Hier sehen Sie eine Auswahl solcher Dokumente, mit denen Sie mehr über Scheme erfahren können:
- Ein Scheme-Primer, von Christine Lemmer-Webber und dem Spritely Institute, auf Deutsch übersetzt von Florian Pelz.
- Scheme at a Glance von Steve Litt.
- Eines der Referenzbücher zu Scheme ist das einflussreiche „Structure and Interpretation of Computer Programs“, von Harold Abelson und Gerald Jay Sussman, mit Julie Sussman. Eine deutsche Übersetzung „Struktur und Interpretation von Computerprogrammen“ hat Susanne Daniels-Herold verfasst. Vom englischen Original finden Sie eine kostenlose Ausgabe online. Viele kennen es unter dem Akronym SICP.
Das Buch können Sie auch installieren und von Ihrem Rechner aus lesen:
guix install sicp info-reader info sicpSie finden noch mehr Bücher, Anleitungen und andere Ressourcen auf https://schemers.org/.
Nach oben: Anleitungen zu Scheme [Inhalt][Index]