Lisp se non nullo

Mi dispiace tanto per il dover fare questa domanda, ma sto cercando di fare un semplice if istruzione, che verifica se una variabile è nil o non.

(defun test (input)
  (let ((testvar (first input)))
   (if (not nil testvar)
    (do this)
    (do that))))

Qualcuno potrebbe spiegare la sintassi corretta per me?

  • Solo (if (not testvar) ...). O mettere il ramo true e (if testvar ...).
InformationsquelleAutor JT93 | 2016-04-08

 

3 Replies
  1. 11

    Dal nil è equivalente al valore booleano false, non c’è bisogno di confrontare esplicitamente.

    Un semplice

    (if testvar
      (...)
      (...))

    farà il lavoro. Hai solo bisogno di not se si desidera controllare il contrario, ad esempio, se si desidera verificare che una variabile non è nil:

    (if (not testvar)
      (...)
      (...))

    A parte questo, c’è anche una funzione di predicato chiamato null che si potrebbe usare. Esso è fondamentalmente pensato per verificare se un dato elenco è vuoto, ma dal momento che la lista vuota è equivalente a nil, funziona (come gli esempi a pagina collegata punto out):

    (null '()) =>  T
    (null nil) =>  T
    (null t) =>  NIL
    (null 1) =>  NIL

    Comunque, questo in pratica si sposta solo il problema di un livello più alto 😉

  2. 1

    Vuoi controllare se la variabile è pari a zero o se non è zero?

    Per non nullo: (if v ... ...)

    Nil: (if (not v) ... ...)

    Ci sono (CL) molte varianti che sono logicamente la stessa, ma può indicare intento di meglio: (if (null v) ... ...) se stesso come il secondo caso di cui sopra, ma potrebbe indicare al lettore che si sta cercando di ` ()‘, invece, una logica di falsità (ossia una lista vuota). E ci sono un sacco di altre varianti.

  3. 0

    jkiiski era giusto:

    Solo (se (non testvar) …). O mettere il ramo true e (se testvar …)

    • Stilistico del commento: Se testvar è “destinato” ad essere un valore booleano, quindi (if testvar ...) e (if (not testvar) ...) sono la strada da percorrere, a mio parere. Se testvar è qualche altro tipo di valore che potrebbe accadere ad essere nullo, allora si potrebbe utilizzare (if (not (null testvar)) ...) e (if (null testvar) ..). Il compilatore dovrebbe probabilmente ottimizzare il loro essere la stessa, ma può rendere il codice più facile da leggere per qualcun altro.

Lascia un commento