определения структуры в схеме

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

поэтому я пытаюсь получить логическое значение в качестве вывода, если два ученика одного возраста, но когда я запускаю его, он говорит, что ожидает строку в качестве 1-го аргумента, но учитывая 19. В чем проблема?


person Kevin R.    schedule 28.01.2013    source источник


Ответы (2)


Вы создаете учащихся, у которых поля 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)))
person nameless    schedule 28.01.2013

Несколько ваших вопросов связаны, вы, кажется, боретесь со сравнениями для разных типов данных, вот несколько указателей:

  • При сравнении чисел используйте =
  • При сравнении символов используйте 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))
person Óscar López    schedule 28.01.2013