Поиск определенного списка на схеме

99
11

У меня есть этот список

 (define masterList(list redApple chickenLeg porkLoin milkD baguetteBread orangeJuice beanCan))

Я пытаюсь сделать функцию под названием lookup, которая примет целое число и вернет элемент из списка, который соответствует этому целому числу. Список содержит элементы из структуры в этом формате

(define-struct storeItem (id des cost))

Поэтому я передам целое число, представляющее id, и я хочу, чтобы функция storeItem была перенастроена.

Например -

(define redApple (make-storeItem 0 "red delicious apple" 1.99))

Если бы я искал masterList и передал его 0, я бы ожидал, что redApple будет возвращен.

Любая помощь по синтаксису?

(define (contains masterList x)
(cond
((null? masterList) #f)
((eq? (car masterList) x) #t)
(else (contains (cdr masterList) x))))

Это то, что я пытаюсь сделать.

Он корректно возвращает true/false в зависимости от того, что я передаю.

(содержит materList redApple) возвращает true.

Как я могу изменить это, чтобы возвращать redApple, если введено 0?

;; These are the constructors to make the elements in our structure
(define redApple (make-storeItem 0 "red delicious apple" 1.99))
(define chickenLeg (make-storeItem 1 "boned chicken" 2.99))
(define porkLoin (make-storeItem 2 "processed pork" 4.99))
(define milkD (make-storeItem 3 "vitamin d milk" 3.99))
(define baguetteBread (make-storeItem 4 "french bread" 0.99))
(define orangeJuice (make-storeItem 5 "fruit juice drink)" 1.49))
(define beanCan (make-storeItem 6 "beans in a can" 2.49)

;; Creating a list that we will use as our master list which contains elements from our structure
(define masterList(list redApple chickenLeg porkLoin milkD baguetteBread orangeJuice beanCan))

спросил(а) 2021-01-25T18:26:04+03:00 5 месяцев назад
1
Решение
99

Ваша общая структура правильная, но вы не проверяете правильное состояние с

(eq? (car masterList) x)

Вы не хотите сравнивать x со всем элементом списка, просто с его компонентом id. Так должно быть:

(= (storeItem-id (car masterList)) x)

Кроме того, для сравнения чисел вы должны использовать = или eqv? а не eq? , См., Какая разница между eq?, eqv?, equal?, и = на Схеме?

Если вы хотите получить объект с идентификатором, а не просто #true или #false, верните (car masterList) когда ID совпадает.

(define (find-storeItem masterList x)
(cond ((null masterList) #false)
((= (storeItem-id (car masterList)) x) (car masterList))
(else (find-storeItem (cdr masterList) x))))

ответил(а) 2021-01-25T18:26:04+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема