如何在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
并希望获取slotid
的值,则该访问器将命名为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是的,我在我的帖子中添加了这种方式。