2016-04-08 4 views
3

Мне очень жаль, что я задал этот вопрос, но я пытаюсь сделать простой оператор if, который проверяет, является ли переменная nil или нет.Lisp if not nil

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

Может ли кто-нибудь объяснить правильный синтаксис для меня?

+2

Просто '(if (not testvar) ...)'. Или сначала поставьте истинную ветвь и сделайте '(if testvar ...)'. – jkiiski

ответ

0

jkiiski был прав:

Просто (если (не testvar) ...). Или сначала поставьте истинную ветвь и сделайте (если testvar ...)

+2

Стилистический комментарий: Если testvar «предназначен» как булев, тогда '(if testvar ...)' и '(if (not testvar) ...)' - это путь, на мой взгляд. Если testvar - это другое значение, которое может оказаться нулевым, то вы можете использовать '(if (not (null testvar)) ...)' и '(if (null testvar) ..)'. Компилятор должен, вероятно, оптимизировать их, чтобы они были одинаковыми, но это может сделать код более удобным для чтения для кого-то другого. –

1

Вы хотите проверить, равна ли переменная nil или нет?

Ибо не ноль: (if v ... ...)

Для нолю: (if (not v) ... ...)

Есть (в CL) множество вариаций, которые все логически то же самое, но может указывать на намерение лучше: (if (null v) ... ...) если такой же, как во втором случае выше но может указать читателю, что вы ищете `() 'вместо логической ложности (т. е. пустой список). И есть много других вариантов.

3

С nil эквивалентно логическому значению false, нет необходимости сравнивать его явно.

Простой

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

будет делать эту работу. Вам нужно только not, если вы хотите проверить на противоположное, например. если вы хотите, чтобы проверить, что переменная не nil:

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

Кроме того, есть также функция предиката называется null, что вы могли бы использовать. Это в основном предназначена для проверки, является ли данный список пуст, но так как пустой список эквивалентен nil, он будет работать (как примеры на связанной странице указывают):

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

Во всяком случае, это в основном только перемещает проблему на один слой вверх ;-)

Смежные вопросы