如何在scheme中编写函数,用car&;查找列表中的元素;cdr?

如何在scheme中编写函数,用car&;查找列表中的元素;cdr?,scheme,racket,Scheme,Racket,我是个新手,不知道怎么做。我有以下清单: (define-struct store(id desc price)) (define master (list (make-store 1 'milk 2.50) (make-store 2 'meat 3.29) (make-store 3 'eggs 1.99) (make-store 4 'cereal 2.99) (make-store 5 'bread 2.79) (make-store 6 'sod

我是个新手,不知道怎么做。我有以下清单:

 (define-struct store(id desc price))
 (define master (list
   (make-store 1 'milk 2.50)
   (make-store 2 'meat 3.29)
   (make-store 3 'eggs 1.99)
   (make-store 4 'cereal 2.99)
   (make-store 5 'bread 2.79)
   (make-store 6 'soda 1.29)
   (make-store 7 'water 4.99)))
我想创建一个函数,它将接受一个id并返回desc和price。但我不确定从哪里开始。有人能帮忙吗


编辑:有没有办法用car和cdr做到这一点?我知道我可以根据需要使用car和cdr检索id描述和价格(store id),(store desc)和(store price),但我如何将其合并到函数中。

您必须使用访问器和一些函数进行or。结构访问器的命名如下:如果您有Struct
store
并希望获取slot
id
的值,则该访问器将命名为
storeid

(store-id (make-store 1 'milk 2.50)) => 1
然后使用或获取结果,并使用其他两个插槽中的值创建新列表

(define (find-by-id obj id)
  (let ((found (findf (lambda (e)
                        (= (store-id e) id))
                      obj)))
    (if found (list (store-desc found)
                    (store-price found))
        #false)))

(find-by-id master 2)
(find-by-id master 5)
(find-by-id master 8)
编辑:带有
car
cdr
的版本。如果结构列表为空,则返回
#false
。Else函数检查列表中的第一个结构。如果
struct id
=
id
,它将返回带有值的列表。否则,仅使用列表的
cdr
再次调用此函数

(define (find-by-id lst id)
  (cond ((null? lst) #false)
        ((= (store-id (car lst)) id)
         (list (store-desc (car lst))
               (store-price (car lst))))
        (else (find-by-id (cdr lst) id))))

有没有办法用car&cdr做到这一点?@Kazumi411是的,我在我的帖子中添加了这种方式。