2016-06-12 3 views
-1

Вот мой Условный операторКак использовать (или) в выражении if?

(if (equal 1 (or 3 2 1)) 
    (write "ok") 
    (write "wrong")) 

Я пытаюсь выполнить код ниже:

(equal 1 (or 3 2 1)) 

Он возвращает ноль

Как кошки я использовать (или) надлежащим образом в этом случае?

+1

ИЛИ возвращает первое истинное значение. Что равно 3. 3 никогда не равно 1. Вы можете сказать нам, что вы хотите сделать. Что означает «правильно»? –

+4

То, что вы сейчас делаете, похоже на '1 == (3 || 2 || 1)' на большинстве других языков. Это, конечно, не имеет смысла. Я предполагаю, что вы ищете '(член 1 '(3 2 1): test #' =)'. – jkiiski

+0

Он работает с целыми числами, но не работает со списком строк. ex: '(член« TAG »'(« TAA »« TAG »))' –

ответ

0

Вы можете использовать find вместо or, если хотите конвертировать свое выражение в список.

(defun test (x) 
    (if (find x '(1 2 3)) 
     (format t "equal") 
     (format t "not equal"))) 
+3

Вы можете использовать find, но член, вероятно, будет намного более идиоматичным здесь. Особенно, если вам когда-либо понадобится проверить, является ли NIL в списке (поскольку find вернет NIL, что является ложным). –

+0

Вы верны. Я забыл о случае NIL:/ Член намного лучше подходит. – cb0

1

Что вы делаете сейчас, как 1 == (3 || 2 || 1) в большинстве других языков. Это, конечно, не имеет смысла. То, что вы ищете,

(member 1 '(3 2 1) :test #'=) 

По умолчанию MEMBER выглядит для конкретного объекта с помощью EQL. Это работает для примитивов, таких как целые числа, но это не будет работать для строк или смешанных целых чисел и плавающих элементов. Вы должны использовать аргумент-ключ для :TEST, чтобы указать правильную функцию сравнения для любого типа ваших элементов.

(member 1.0 '(3 2.0 1) :test #'=) ; numeric 
(member "fOo" '("foo" "FOO" "fOo") :test #'string=) ; case-sensitive 
(member "foo" '("FOO" "BAR" "QUUX") :test #'string-equal) ; case-insensitive 
+0

Это на самом деле имеет смысл. Это просто требует оператора «амбара» Джона Маккарти или что-то в этом роде. – Kaz

0

Первый из них. Как работает или работает на lisp? Начнем с нескольких примеров.

  • (OR 5, 4 3) -> 5

  • (OR 1 2 3) -> 1

  • (ИЛИ ноль 7 8) -> 7

Вывод функции OR - это только один элемент, не равный NIL.

Так что в вашем коде: (равный 1 3) -> NIL

Эта функция проверяет, является ли элемент п существует в списке л

, например

  • (Findout 1 '(3 2 1)) -> Т

  • (Findout 4' (3 2 1)) -> NIL

(defun findout (n l) (if (null l) nil (if (equal (car l) n) t (findout n (cdr l)) ) ) )

И тогда вы можете изменить свой код так:

(if (findout 1 '(3 2 1)) 
(write "yes") 
(write "no") 

)

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