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.0d0
Threads 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 4999950000
Tests 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 Fehler
Merke
- 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
Aufgabe
Installiere Quicklisp und lade alexandria; probiere alexandria:flatten.