Ricerca…


Vero e falso

Il simbolo speciale T rappresenta il valore true in Common Lisp, mentre il simbolo speciale NIL rappresenta false :

CL-USER> (= 3 3)
T
CL-USER> (= 3 4)
NIL

Si chiamano "Variabili Costanti" (sic!) Nello standard, poiché sono variabili il cui valore non può essere modificato. Di conseguenza, non è possibile utilizzare i loro nomi per le variabili normali, come nell'esempio seguente, errato:

CL-USER> (defun my-fun(t)
           (+ t 1))
While compiling MY-FUN :
Can't bind or assign to constant T.

In realtà, si possono considerare semplicemente come costanti o come simboli auto-valutati. T e NIL sono speciali anche in altri sensi. Ad esempio, T è anche un tipo (il supertipo di qualsiasi altro tipo), mentre NIL è anche la lista vuota:

CL-USER> (eql NIL '())
T
CL-USER> (cons 'a (cons 'b nil))
(A B)

Booleani generalizzati

In realtà qualsiasi valore diverso da NIL è considerato un valore vero in Common Lisp. Per esempio:

CL-USER> (let ((a (+ 2 2)))
           (if a
               a
               "Oh my! 2 + 2 is equal to NIL!"))
4

Questo fatto può essere combinato con gli operatori booleani per rendere i programmi più concisi. Ad esempio, l'esempio sopra è equivalente a:

CL-USER> (or (+ 2 2) "Oh my! 2 + 2 is equal to NIL!")
4

La macro OR valuta i suoi argomenti in ordine da sinistra a destra e si ferma non appena trova un valore non NIL, restituendolo. Se tutti sono NIL , il valore restituito è NIL :

CL-USER> (or (= 1 2) (= 3 4) (= 5 6))
NIL

Analogamente, la macro AND valuta i suoi argomenti da sinistra a destra e restituisce il valore dell'ultimo, se tutti sono valutati su non-NIL, altrimenti arresta la valutazione non appena trova NIL , restituendola:

CL-USER> (let ((a 2)
               (b 3))
           (and (/= b 0) (/ a b)))
2/3
CL-USER> (let ((a 2)
               (b 0))
           (and (/= b 0) (/ a b)))
NIL

Per questi motivi, AND e OR possono essere considerati più simili alle strutture di controllo di altri linguaggi, piuttosto che agli operatori booleani.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow