Сравните две переменные, если я не знаю их тип - PullRequest
0 голосов
/ 07 марта 2019

Я изучаю Scheme и хочу сравнить две переменные, но я не знаю, какой тип будет иметь каждую из них.

На этот ТАК ответ , говорит, когда использовать =, eqv ?, равно? и eq ?, но я не нашел то, что искал.

Моя проблема в том, что переменные могут быть:

  1. Список: '(1 2) или '((10) 2).
  2. Строка: 'sunny.
  3. Номер: 2.

Так что я мог бы сравнивать число со списком или список со строкой.

У меня есть этот код:

(define contains?
  (lambda (lst element)
    (cond
      [(null? lst) #f]
      [(equal? (car lst) element) #t]
      (else [(contains? (cdr lst) elements)]))))

Какой оператор можно использовать для сравнения двух этих переменных?

Ответы [ 2 ]

3 голосов
/ 07 марта 2019

Если вы хотите проверить их на равенство , тогда equal? - ваша лучшая ставка, это самый общий предикат равенства, и поэтому он работает с несколькими типами данных, и выполняет рекурсивные сравнения для списков, векторов и т. д.:

Два значения равны? если и только если они являются eqv ?, если не указано иное для конкретного типа данных.

Типы данных с дальнейшей спецификацией равны? включают строки, байтовые строки, пары, изменяемые пары, векторы, блоки, хеш-таблицы и проверяемые структуры. В последних шести случаях равенство определяется рекурсивно; если и v1, и v2 содержат опорные циклы, они равны, когда бесконечные развертки значений будут равны.

0 голосов
/ 08 марта 2019

Просто чтобы добавить к Оскару ответ.Существуют специфичные для типа процедуры, такие как string=?, char=? и = для чисел, но для сравнения в общем случае существует 3:

  • eq? тестов, если два аргумента имеют одинаковое значение, как в созданном в тот же момент момент или указатель равен.
  • eqv? проверяет, выглядят ли два примитивных / скалярных / атомарных значения одинаково при отображении
  • equal? проверяет, выглядят ли два значения одинаково

Кроме того,что #t для eq? гарантированно равно #t для eqv? abd, что #t для eqv? гарантированно равно #t для equal?.

Я прочитал книги, которые полностью пропускают eqv? и просто держу eq? и equal? в качестве общего сравнения.Изрядное количество процедур, которые сравнивают вещи, имеют 3 варианта 3 методов сравнения по всем направлениям.Например.member (equal?), memv (eqv?), memq (eq?).

О eq?: мы гарантируем, что '(), #t, #f и символы, такие как 'test, будут каждый раз принимать одно и то же значение, поэтому они всегда равны указателю,Другие значения могут быть, например, число от миллиарда, но у вас нет гарантии, что все реализации сделают это.(eq? 10 10) ; ==> #f является правильным в соответствии со стандартом, а также (eq? '(a) '(a)) ; ==> #t.На самом деле эти два примера могут иметь любой результат, и это нормально для отчета.Обратите внимание, как я говорю, вы гарантированно будете #t с eqv?, если eq? yuilds #t, но не наоборот.Если что-то eqv?, вы все еще не представляете, что будет eq?.

...