2016-06-12 4 views
1

Я как бы борюсь с этим языком. Я пытаюсь сделать условие, которое выполняется только, когда оно ложно. У меня есть функция, которая возвращает false, но я не знаю, как это сделать. Смотрите код ниже:Условие, которое проверяет утверждение оператора, неверно

(define p (make-queue)) 
(enqueue! p 1) 
(enqueue! p 1) 
(enqueue! p 2) 
(enqueue! p 3) 
(memq 5 (queue->list p)) 
(cond 
    [(false? (memq 4 (queue->list p))) "yaay"] 
) 

В основном я создаю очереди, то я спрашиваю с memq, если есть нужное значение в списке, в моем случае возвращает ложь. И теперь мне нужно выполнить часть «yaay». Как я могу это достичь? Я пытался просить ложь, я пытался (= (#f) (memq 4 (queue->list p))) или несколько простых сослагательного наклонения, но это не работает, либо

ответ

3

Обычный способ проверить состояние вы хотите бы:

(cond 
    [(not (memq 4 (queue->list p))) "yaay"]) 

Помните, что в схеме только ложное значение #f, все остальное считается истинным, - в том числе null, '(), 0, "" и т.д.

В этом случае memq вернется т он list, который начинается с искомого элемента, если он был найден, или #f в противном случае, и not отрицает результат, что означает, что условие истинно, только если элемент отсутствует в списке.

Одна последняя вещь - memq использует eq? для сравнения, это лучше использовать member, которая использует equal? и является более общим (и я думаю, что это причина, почему ваш код не так, как ожидалось); вы должны прочитать в документации разницу между equal? и eq?, чтобы понять, почему это имеет значение.

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