Поиск определенного списка в схеме - PullRequest
0 голосов
/ 15 октября 2018

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

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

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

(define-struct storeItem (id des cost))

Поэтому я передам целое число, представляющее идентификатор, и я хочу, чтобы 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))))

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

Возвращает истину / ложь правильно, исходя из того, что я передаю.

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

Как я могу изменить это, чтобы вернуть 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))

1 Ответ

0 голосов
/ 15 октября 2018

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

(eq? (car masterList) x)

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

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

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

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

(define (find-storeItem masterList x)
  (cond ((null masterList) #false)
        ((= (storeItem-id (car masterList)) x) (car masterList))
        (else (find-storeItem (cdr masterList) x))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...