Kurz: ASDF beschreibt Systeme (Projekte), Quicklisp lädt Bibliotheken:
Teil des Kurses Common Lisp
Kapitel 7 von 8 im Kurs Common Lisp. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.
Quicklisp und ASDF
ASDF beschreibt Systeme (Projekte), Quicklisp lädt Bibliotheken:
curl -O https://beta.quicklisp.org/quicklisp.lisp
sbcl --load quicklisp.lisp --eval '(quicklisp-quickstart:install)' --eval '(ql:add-to-init-file)'
sbcl --eval '(ql:quickload "alexandria")';; meinprojekt.asd
(asdf:defsystem "meinprojekt"
:depends-on ("alexandria" "cl-ppcre")
:components ((:file "paket") (:file "hauptprogramm")))| Bibliothek | Zweck |
|---|---|
| Alexandria | Hilfsfunktionen für Alltagsaufgaben |
| cl-ppcre | Reguläre Ausdrücke |
| bordeaux-threads | Threads |
| Hunchentoot, Clack | Webserver |
| FiveAM, Parachute | Tests |
| Serapeum | Funktionale Erweiterungen |
| CLSQL, Postmodern | Datenbanken |
| Cffi | Aufruf von C-Bibliotheken |
Typen und Optimierung
Common Lisp ist dynamisch typisiert, erlaubt aber Deklarationen für schnellen Code:
(defun summe-schnell (n)
(declare (type fixnum n) (optimize (speed 3) (safety 0)))
(let ((s 0))
(declare (type fixnum s))
(dotimes (i n s)
(incf s i))))
(format t "~a~%" (summe-schnell 1000000))
(format t "~a ~a ~a~%" (type-of 1) (type-of 1.5) (type-of "a"))
(format t "~a ~a~%" (type-of 'a) (type-of '(1)))
(format t "~a ~a~%" (typep 5 'integer) (typep 5 '(integer 0 10)))
(deftype kleine-zahl () '(integer 0 99))
(format t "~a ~a~%" (typep 5 'kleine-zahl) (typep 500 'kleine-zahl))
(check-type 5 integer)
(format t "~a~%" (coerce 3 'double-float))Ausgabe:
499999500000
BIT SINGLE-FLOAT (SIMPLE-ARRAY CHARACTER (1))
SYMBOL CONS
T T
T NIL
3.0d0Threads und Zeit
(defun zeit-messen (f)
(let ((start (get-internal-real-time)))
(funcall f)
(- (get-internal-real-time) start)))
(format t "~a~%" (>= (zeit-messen (lambda () (loop repeat 1000 sum 1))) 0))
(format t "~a~%" (loop for i below 100000 sum i))Ausgabe:
T
4999950000Tests ohne Bibliothek
(defvar *ok* 0)
(defvar *fehler* 0)
(defmacro pruefe (ausdruck erwartet)
`(let ((ist ,ausdruck))
(if (equal ist ,erwartet)
(progn (incf *ok*) (format t "ok ~s~%" ',ausdruck))
(progn (incf *fehler*) (format t "FEHLER ~s => ~s (erwartet ~s)~%" ',ausdruck ist ,erwartet)))))
(defun fakultaet (n) (if (<= n 1) 1 (* n (fakultaet (1- n)))))
(pruefe (fakultaet 5) 120)
(pruefe (fakultaet 0) 1)
(pruefe (mapcar #'1+ '(1 2)) '(2 3))
(pruefe (+ 1 1) 3)
(format t "~a ok, ~a Fehler~%" *ok* *fehler*)Ausgabe:
ok (FAKULTAET 5)
ok (FAKULTAET 0)
ok (MAPCAR #'1+ '(1 2))
FEHLER (+ 1 1) => 2 (erwartet 3)
3 ok, 1 FehlerMerke
- ASDF definiert Systeme, Quicklisp lädt Bibliotheken
- Typdeklarationen und
optimizemachen Lisp-Code so schnell wie C - Die REPL-Entwicklung (SLIME, Sly) ist das Herzstück des Lisp-Alltags
- Tests lassen sich sogar mit einem kleinen Makro selbst bauen
Übungsaufgabe
Installiere Quicklisp und lade alexandria; probiere alexandria:flatten.
Quiz zur Selbstkontrolle
Wofür steht ASDF?
- Das Build-System für Lisp-Projekte (richtig)
- Ein Editor
- Ein Compiler
- Eine Sprache
Was ist Quicklisp?
- Ein Bibliotheks-Manager für Common Lisp (richtig)
- Eine REPL
- Ein Debugger
- Ein Speichermodell
Wofür sind declare-Angaben gut?
- Typ- und Optimierungshinweise für den Compiler (richtig)
- Kommentare
- Imports
- Tests
Weiter im Kurs
Zurück: Ein-/Ausgabe, Format und Pakete
Weiter: Referenz und Spickzettel
Alle Kapitel: Common Lisp im Überblick