EMZETT.
Login

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")))
BibliothekZweck
AlexandriaHilfsfunktionen für Alltagsaufgaben
cl-ppcreReguläre Ausdrücke
bordeaux-threadsThreads
Hunchentoot, ClackWebserver
FiveAM, ParachuteTests
SerapeumFunktionale Erweiterungen
CLSQL, PostmodernDatenbanken
CffiAufruf 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 optimize machen 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

Weiter im Kurs

Zurück: Ein-/Ausgabe, Format und Pakete

Weiter: Referenz und Spickzettel

Alle Kapitel: Common Lisp im Überblick