2016-04-08 31 views
3

Bu soruyu sorduğum için çok üzgünüm, ancak bir değişken nil olup olmadığını kontrol eden basit bir if ifadesini yapmaya çalışıyorum.Lisp değilse null

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

Herkes uygun sözdizimini açıklayabilir mi?

+2

Sadece '((testvar değil)). Ya da ilk önce gerçek dalı ve '(eğer testvar ...') 'deyin. – jkiiski

cevap

0

jkiiski haklıydı:

Hemen (if (TestVar değil) ...). Ya da ilk önce gerçek dalı ve yerine koyun (testvar ...)

+2

Stilistik bir yorum: Eğer testvar "amaçlanan" bir boole olmaksa, o zaman (eğer testvar ...) ve (eğer (testvar) değilse ...) 'dir. Eğer testvar, nil olduğu düşünülebilen başka bir tür değer ise, o zaman (eğer (değil (null testvar)) ...) 've' (if (null testvar) ..) 'kullanabilirsiniz. Derleyici muhtemelen onları aynı olacak şekilde optimize etmelidir, ancak kodun başkası için okunmasını kolaylaştırabilir. –

1

Değişkenin sıfır olup olmadığını veya sıfır yoksa mı kontrol etmek istersiniz? olup nil için

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

(CL) vardır her mantıksal aynıdır ancak niyet daha gösterebilir çok varyasyon: (if (null v) ... ...), aynı ikinci durumda olduğu gibi, yukarıda nil için (if v ... ...)

ama okuyucuya mantıksal bir yanlışlık (yani boş bir liste) yerine `() 'aradığınızı gösterebilir. Ve bol miktarda başka varyasyon var.

3

nil, false boolean değerine eşdeğer olduğundan, açıkça karşılaştırmanıza gerek yoktur.

Basit

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

iş yapacak. Tersini kontrol etmek isterseniz sadece not'a ihtiyacınız var, örn. Eğer bir değişken değildir nil olup olmadığını kontrol etmek istiyorsanız: Bunun dışında

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

bir uygulama yapabilirsiniz null adında bir yüklem işlevi de vardır. Temelde, belirli bir liste boş olup olmadığını kontrol içindir, ama boş liste nil eşdeğerdir çünkü (bağlantılı sayfadaki örnekler işaret gibi), işe yarayacak:

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

Neyse, bu temelde sadece Sorun bir katman yukarı taşınır ;-)