Как проверить равенство символов в кавычках на схеме? - PullRequest
5 голосов
/ 13 июня 2011

В этом примере

> (= 1 1)
#t
> (= 'a 'a)
*** ERROR IN (console)@2.1 -- (Argument 1) NUMBER expected
(= 'a 'a)
1> 

Как я могу проверить равенство символов в кавычках?

Ответы [ 2 ]

8 голосов
/ 13 июня 2011

Вы используете любой из eq?, eqv? или equal?.

Все три можно использовать с любыми объектами без ошибок (в отличие от =, который может использоваться только с числами). Однако результат будет отличаться в зависимости от того, какие типы вы передаете. Но если вы знаете, что сравниваете символы, все они будут иметь одинаковый результат.

Если вы занимались программированием на Java, eqv? - это ==, а equal? - .equals(). Проще говоря, eqv? делает сравнение идентификаторов, а equal? делает сравнение значений.

eq? выполняет прямое сравнение указателей. Для некоторых реализаций он может быть быстрее, чем eqv?, с пониманием, что иногда он возвращает false для равных чисел или символов. Для других реализаций он точно идентичен на eqv?. В большинстве случаев для надежности вы должны использовать eqv? для сравнения идентификаторов и забыть, что eq? существует.)

0 голосов
/ 02 ноября 2018

Из документации схемы https://www.gnu.org/software/guile/manual/html_node/Equality.html

eq? проверяет только один и тот же объект (по сути, сравнение указателей).Это быстро и может быть использовано при поиске определенного объекта или при работе с символами или ключевыми словами (которые всегда являются уникальными объектами).

eqv? расширяет eq?, чтобы посмотреть на значение чисели персонажи.Например, его можно использовать, например, = (см. Сравнение ), но без ошибки, если один операнд не является числом.

equal? идет дальше, выглядит (рекурсивно)) в содержимое списков, векторов и т. д. Это хорошо, например, для списков, которые были прочитаны или рассчитаны в разных местах и ​​являются одинаковыми, но не состоят из одних и тех же пар.Такие списки выглядят одинаково (при печати) и равны?будет считать их одинаковыми.

...