Как сравнить имена, такие, как этот случай:Сравнивая имена с равными
(if (= name '(bill)) (write-line '(over)))
?
Как сравнить имена, такие, как этот случай:Сравнивая имена с равными
(if (= name '(bill)) (write-line '(over)))
?
Прежде всего, маловероятно, что вы хотите, чтобы имя было '(bill)
, которое представляет собой список, состоящий из одного символа 'bill
. Вы, вероятно, просто хотите 'bill
напрямую. Во-вторых, вы не можете использовать =
для сравнения символов: =
предназначен для числовых сравнений. symbol=?
, вероятно, что вы хотите: (. Обратите внимание, что есть некоторые другие функции равенства, которые будут работать здесь, и вы также можете увидеть другие люди используют eq?
или equal?
вместо symbol=?
здесь)
(if (symbol=? name 'bill) ...)
Процедура, используемая для проверки равенства, зависит от типа сравниваемых операндов. В частности, =
процедура используется для сравнения между номерами:
(= 1 1)
Но что, кажется, не так. Если name
символ:
(symbol=? name 'bill)
Если name
является строкой:
(string=? name "bill")
Если name
это один символ:
(char=? name #\b)
Если имя всписок:
(member name '(bill))
Наконец, если вы не уверены в типе названия, вы всегда можете использовать equal?
:
(equal? name "bill")
+1 за наконечник на конце. Обычно вы не будете использовать _wrong_, используя 'equal?'. Вы можете пойти _slow_ (медленнее, чем необходимо), это все. Например, было бы несколько быстрее сравнить два символа с 'eq?', Но ваша программа будет работать правильно, если вы используете 'equal?'. –