2.4.2. Boolean
Boolean ist ein der Aussagenlogik entlehnter Datentyp, der nur zwei Werte kennt: wahr oder falsch. Diese Werte werden in Common Lisp durch die speziellen Symbole T
und NIL
dargestellt.
Dieser Datentyp ist für die Ablaufsteuerung in Lisp von großer Bedeutung und es existieren auffällig viele verschiedene Funktionen, die einen dieser Werte zurückliefern. Häufig ist es sinnvoll, solche Funktionen für bestimmte Anwendungsfälle in einem Programm selbst zu definieren.
Diese Funktionen werden analog zum gleichen Begriff in der Aussagenlogik Prädikat (englisch predicate) genannt. Kurz ausgedrückt ist ein Prädikat also nichts anderes, als eine Funktion, die den Wert T
oder NIL
zurückliefert. Viele der in Common Lisp bereitgestellten Prädikatfunktionen verwenden die Konvention, dass zur Kennzeichnung, dass es sich um ein Prädikat handelt, ihr Name mit dem Buchstaben "p" endet (wie z.B. consp
, integerp
, etc.)
Sehr wichtig und im Anwendungsfall oft praktisch ist zudem, dass Funktionen, die Prädikate erfordern (wie if
, cond
, unless
, when
, case
, etc.), alle Werte, die nicht NIL sind, genauso behandeln, wie den Wert T, wie im folgenden Beispiel zu sehen ist:
;;; normaler Anwendungsfall: #'> ist das Prädikat, das von "if" als ;;; erstes Argument benötigt wird: (if (> 4 3) 'gelb 'blau) -> gelb ;;; alle Ausdrücke, die *nicht* NIL sind, werden behandelt, als währen ;;; sie T. In den folgenden Beipielen sind die Funktionen #'+ bzw. der ;;; String "hallo" kein Prädikat im eigentlichen Sinne, aber sie ;;; können wie ein Prädikat verwendet werden: (if (+ 3 1) 'gelb 'blau) -> gelb (if "hallo" 'gelb 'blau) -> gelb (if NIL 'gelb 'blau) -> blau
Hier einige Beispiele für Prädikate:
;;; Tests ;;; =, >, <, >=, <=, evenp, oddp, (= 4/5 0.8) ;; -> NIL ! (= (float 4/5) 0.8) ;; -> T (>= 5/6 0.8) ;; -> T ;;; Test für gerade/ungerade (evenp 3) ;; -> NIL (oddp 3) ;; -> T ;;; Test für Datentypen (numberp 4) ;; -> T (integerp 4) ;; -> T (numberp 4/3) ;; -> T (integerp 4/3) ;; -> NIL (numberp 4.13) ;; -> T (integerp 4.13) ;; -> NIL (floatp 4.13) ;; -> T (numberp "Helmut") ;; -> NIL (stringp "Helmut") ;; -> T (atom "Helmut") ;; -> T (atom 'Hallo) ;; -> T (atom '(1 2 3)) ;; -> NIL ;;; Test, ob Ausdrücke Listen bzw. cons Zellen sind: (listp 4) ;; NIL (listp '(1 2 3)) ;; -> T (consp '(1 2)) ;; -> T ;;; Achtung: NIL ist eine Liste, aber *keine* Cons Zelle! (listp '()) ;; -> T (consp '()) ;; -> NIL ;;; Test für die leere Liste bzw. NIL: (null '()) ;; T