про символы в рэкет

(define-struct student (first last major))

(define student1 (make-student "John" "Smith" 'CS))
(define student2 (make-student"Jane" "Jones" 'Math))
(define student3 (make-student "Jim" "Black" 'CS))

#;(define (same-major? s1 s2)
  (symbol=? (student-major s1)
            (student-major s2)))

когда я набираю их, я получаю ожидаемый ответ.

;;(same-major? student1 student2) -> FALSE
;;(same-mejor? student1 student3) -> True

Но когда я хочу узнать, есть ли у учеников одинаковые имена, он говорит мне, что они ожидают символ в качестве 1-го аргумента, но с учетом Джона.

(define (same-first? s1 s2)
  (symbol=? (student-first s1)
            (student-first s2)))

Что я делаю неправильно?


person Josh    schedule 25.01.2013    source источник


Ответы (2)


'CS и 'Math являются символами, а "Джон", "Джейн" и "Джим" - нет (это строки). Как сообщает вам сообщение об ошибке, аргументы symbol=? должны быть символами.

Чтобы сравнить строки на равенство, вы можете использовать string=? или просто equal? (что работает со строками, символами и почти всем остальным).

person sepp2k    schedule 25.01.2013

Измените это:

(symbol=? (student-major s1)
          (student-major s2)))

К этому:

(string=? (student-major s1)
          (student-major s2)))

Обратите внимание, что вы сравниваете строки, а не символы, поэтому необходимо использовать соответствующую процедуру проверки равенства.

person Óscar López    schedule 25.01.2013