有没有办法在不传递新数据的情况下访问Racket中的存储列表?在我正在处理的程序中使用以下代码存储过去的响应列表。
(define (storage response lst)
(cons response lst))
这通过对问题和先前列表做出回答来制作列表。我不想改变列表中的内容只是看看里面有什么。如果需要其他代码,我将很乐意展示我的内容。
答案 0 :(得分:0)
按照目前的构造,你创建了一个名为storage的函数,它接受响应和一个列表,并返回一个新的列表,其中响应为head,lst为尾。
如果你想获得(storage a l)
的头部或尾部,那么你只需拨打(car (storage a l))
或(cdr (storage a l))
- 这只是一个列表。
答案 1 :(得分:0)
是的,有一种方法可以访问存储列表而不将其作为新数据传递。有关“列表访问”功能的完整列表,请参见Scheme R5RS Specification中的第25页第6.3.2节。球拍可能有更多;其他Scheme版本可能还有其他版本。
这是一个例子。测试是否已经看到“响应”:
(member response lst)
计算回复数量:
(length lst)
答案 2 :(得分:0)
在Racket中访问列表元素的标准方法是使用first
和rest
过程(或等效地:car
和cdr
)递归迭代名单。例如,假设您要查明列表是否包含"404"
响应:
(define responses '("302" "403" "404" "505"))
(define (find-response lst response)
; the list is empty, the element was not found
(cond ((empty? lst)
#f)
; `first` accesses the first element in the list
((equal? (first lst) response)
#t)
(else
; `rest` advances to the next elements in the list
(find-response (rest lst) response))))
(find-response responses "404")
=> #t
(find-response responses "201")
=> #f
当然,一旦您了解其工作原理,您就可以移动并使用现有程序,例如member
,如其他答案所示。请查看列表程序available for use,您将看到最常用的操作已经实施并随时可用。