1
(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

但是当我想知道学生是否有相同的名字时,它告诉我他们期望一个符号作为第一个参数,但给定的是 John。

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

我究竟做错了什么?

4

2 回答 2

4

'CS并且'Math是符号,“John”、“Jane”和“Jim”不是(它们是字符串)。正如错误消息告诉您的那样,参数symbol=?需要是符号。

要比较字符串是否相等,您可以使用string=?or just equal?(适用于字符串、符号和几乎所有其他内容)。

于 2013-01-25T17:23:53.530 回答
1

改变这个:

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

对此:

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

请注意,您要比较的是字符串而不是符号,因此必须使用适当的相等过程。

于 2013-01-25T17:25:29.457 回答