有没有办法在不传递新数据的情况下访问 Racket 中的存储列表?过去响应的列表使用以下代码存储在我正在处理的程序中。
(define (storage response lst)
(cons response lst))
这通过对问题和先前列表的响应来制作列表。我不想更改列表中的内容,只是简单地查看其中的内容。如果需要其他代码,我将很乐意展示我所拥有的。
在 Racket 中访问列表元素的标准方法是使用first
andrest
过程(或等效:car
and 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
其他答案中所建议的。请查看可用的程序列表,您会发现最常用的操作已经实现并可供您使用。
是的,有一种方法可以访问存储的列表,而无需将其作为新数据传递。有关“列表访问”功能的完整列表,请参见方案 R5RS 规范中的第 25 页第 6.3.2 节。球拍可能有更多;其他 Scheme 版本可能还有其他版本。
这是一个例子。要测试是否已经看到“响应”:
(member response lst)
计算响应数:
(length lst)
按照当前的构造,您创建了一个名为 storage 的函数,该函数接受 response 和一个列表,并返回一个新列表,其中 response 作为头部,lst 作为尾部。
如果你想得到它的头部或尾部,(storage a l)
那么你只需调用(car (storage a l))
或(cdr (storage a l))
- 它只是一个列表。