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

しかし、生徒が同じ名を持っているかどうかを知りたいときは、最初の引数として記号を期待しているが、ジョンが与えられていることを教えてくれます。

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

私は何が間違っているのですか?

4

2 に答える 2

4

'CS'Mathは記号ですが、「ジョン」、「ジェーン」、「ジム」はそうではありません(文字列です)。エラーメッセージが示しているように、引数はsymbol=?シンボルである必要があります。

文字列が等しいかどうかを比較するには、string=?またはを使用できます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 に答える