1
(define-struct student (first last major age))

(define student1 (make-student "David" "Smith" 'Math 19))
(define student2 (make-student"Joe" "Jones" 'Math 21))
(define student3 (make-student "Eli" "Black" 'Spanish 20))

(define (same-age? s1 s2)
  (string=? (student-age s1)
            (student-age s2)))

したがって、2人の学生が同じ年齢の場合、出力としてブール値を取得しようとしていますが、実行すると、最初の引数として文字列が必要であると表示されますが、19が与えられます。問題は何ですか。

4

2 に答える 2

3

いくつかの質問が関連しています。さまざまなデータ型の比較に苦労しているようです。ここにいくつかの指針があります。

  • 数値を比較するときは、=
  • 文字を比較するときは、char=?
  • 記号を比較するときは、symbol=?
  • 文字列を比較するときは、string=?
  • または、単にequal?、いくつかのタイプで機能し、両方のオペランドが同じタイプで等しい限りtrueを返すキャッチオールプロシージャを使用します

たとえば、次のすべての比較は次を返し#tます。

(equal? 1 1)
(equal? 1.5 1.5)
(equal? #\a #\a)
(equal? 'x 'x)
(equal? "a" "a")
(equal? (list 1 2 3) (list 1 2 3))
于 2013-01-28T00:47:22.503 に答える
1

フィールドが文字列ではなく整数である生徒を作成しage(二重引用符がないことに注意してください)、string=?関数を使用してそれらを比較してみます。次の関数を使用し=て比較する必要がありageます。

(define-struct student (first last major age))

(define student1 (make-student "David" "Smith" 'Math 19))
(define student2 (make-student "Joe" "Jones" 'Math 21))
(define student3 (make-student "Eli" "Black" 'Spanish 20))

(define (same-age? s1 s2)
  (= (student-age s1)
     (student-age s2)))

ageまたは、フィールドを文字列で表した生徒を作成します。

(define-struct student (first last major age))

(define student1 (make-student "David" "Smith" 'Math "19"))
(define student2 (make-student "Joe" "Jones" 'Math "21"))
(define student3 (make-student "Eli" "Black" 'Spanish "20"))

(define (same-age? s1 s2)
  (string=? (student-age s1)
            (student-age s2)))
于 2013-01-28T00:08:12.970 に答える