Up: Scheme tutorials [Contents][Index]
Guix uses the Guile implementation of Scheme. To start playing with the
language, install it with guix install guile and start a
REPL—short for read-eval-print loop—by running guile from the command line.
Alternatively you can also run guix shell guile -- guile
if you’d rather not have Guile installed in your user profile.
In the following examples, lines show what you would type at the REPL; lines starting with “⇒” show evaluation results, while lines starting with “-|” show things that get printed. See Using Guile Interactively in GNU Guile Reference Manual, for more details on the REPL.
#true
and #false (abbreviated #t and #f) stand for the
Booleans “true” and “false”, respectively.
Examples of valid expressions:
"Hello World!" ⇒ "Hello World!" 17 ⇒ 17 (display (string-append "Hello " "Guix" "\n")) -| Hello Guix! ⇒ #<unspecified>
lambda term:
(lambda (x) (* x x)) ⇒ #<procedure 120e348 at <unknown port>:24:0 (x)>
The above procedure returns the square of its argument. Since everything is
an expression, the lambda expression returns an anonymous procedure,
which can in turn be applied to an argument:
((lambda (x) (* x x)) 3) ⇒ 9
define:
(define a 3) (define square (lambda (x) (* x x))) (square a) ⇒ 9
(define (square x) (* x x))
list procedure:
(list 2 a 5 7) ⇒ (2 3 5 7)
'(display (string-append "Hello " "Guix" "\n")) ⇒ (display (string-append "Hello " "Guix" "\n")) '(2 a 5 7) ⇒ (2 a 5 7)
`(2 a 5 7 (2 ,a 5 ,(+ a 4))) ⇒ (2 a 5 7 (2 3 5 7))
Note that the above result is a list of mixed elements: numbers, symbols (here
a) and the last element is a list itself.
let (see Local
Bindings in GNU Guile Reference Manual):
(define x 10)
(let ((x 2)
(y 3))
(list x y))
⇒ (2 3)
x
⇒ 10
y
error→ In procedure module-lookup: Unbound variable: y
Use let* to allow later variable declarations to refer to earlier
definitions.
(let* ((x 2)
(y (* x 3)))
(list x y))
⇒ (2 6)
#: (hash, colon) followed by
alphanumeric characters: #:like-this.
See Keywords in GNU Guile Reference Manual.
% is typically used for read-only global variables in
the build stage. Note that it is merely a convention, like _ in C.
Scheme treats % exactly the same as any other letter.
define-module (see Creating Guile
Modules in GNU Guile Reference Manual). For instance
(define-module (guix build-system ruby)
#:use-module (guix store)
#:export (ruby-build
ruby-build-system))
defines the module guix build-system ruby which must be located in
guix/build-system/ruby.scm somewhere in the Guile load path. It
depends on the (guix store) module and it exports two variables,
ruby-build and ruby-build-system.
Going further: Scheme is a language that has been widely used to teach programming and you’ll find plenty of material using it as a vehicle. Here’s a selection of documents to learn more about Scheme:
- A Scheme Primer, by Christine Lemmer-Webber and the Spritely Institute.
- Scheme at a Glance, by Steve Litt.
- Structure and Interpretation of Computer Programs, by Harold Abelson and Gerald Jay Sussman, with Julie Sussman. Colloquially known as “SICP”, this book is a reference.
You can also install it and read it from your computer:
guix install sicp info-reader info sicpAn unofficial ebook is also available.
You’ll find more books, tutorials and other resources at https://schemers.org/.
Up: Scheme tutorials [Contents][Index]