Схема - эк?сравнить 2 строки? - PullRequest
4 голосов
/ 20 апреля 2011

У меня проблема в моей программе.

У меня есть условие, которое сравнивает 2 строки:

(if (eq? (Exp1) (exp2)))

Когда exp1 дает мне строку, а exp2 - строку. Чтобы быть уверенным, когда я меняю "эквалайзер"? на "=", это дает мне следующую проблему:

=: ожидает тип в качестве 2-го аргумент, данный: то есть; другие аргументы были: т.е..

Когда я запускаю программу, функция не вводит первое выражение в функцию «if» и вводит второе (это означает, что условие ложно).

Что я могу сделать?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 20 апреля 2011

Согласно разделу Предикаты эквивалентности в R6RS, вы должны использовать equal?, а не eq?, который вместо этого проверяет, являются ли два его аргумента абсолютно одинаковыми объектами (а не два объекта с одинаковымиvalue).

(eq? "a" "a")                           ; unspecified
(equal? "abc" "abc")                    ; #t

Как отмечается в комментарии, в разделе Strings также упоминается string=?, специально для сравнения строк, что, вероятно, позволяет избежать проверки типа.

0 голосов
/ 11 января 2012

Я написал небольшую вспомогательную функцию для этой проблемы.

; test if eq?
(define ==
  (lambda (x y)
    (if (and (string? x) (string? y))
      (string=? x y)
      (if (or (string? x) (string? y))
            (= 1 0) ;return false
            (equal? x y)))))
(define a "aString")
(define l '("aString" "aOtherString"))
(== (car l) a) ; true
(== 1 1) ; true
(== 1 0) ; false
(== "a" 1) ; false diff. type
(== "a" "b") ; false
(== "a" "a") ; true
(== '("a" "b") '("a" "b"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...