[英]Accessing a stored list in Racket
有没有办法在Racket中访问存储的列表而不传递新数据? 我正在使用的程序中使用以下代码存储了以往响应的列表。
(define (storage response lst)
(cons response lst))
这是通过回答问题和上一个列表来创建的。 我不想更改列表中的内容,而只是查看其中的内容。 如果需要其他代码,我将很乐意展示我所拥有的。
按照当前的构造,您创建了一个名为storage的函数,该函数接受响应和一个列表,并返回一个新列表,其中以response为首,lst为尾。
如果您想获取(storage al)
的头或尾,则只需调用(car (storage al))
或(cdr (storage al))
-这只是一个列表。
是的,有一种方法可以访问存储的列表而不将其作为新数据传递。 有关“列表访问”功能的完整列表,请参见Scheme R5RS规范的第25页的6.3.2节。 球拍可能还有更多; 其他Scheme版本可能还有其他版本。
这是一个例子。 要测试是否已经看到“响应”:
(member response lst)
计算响应数:
(length lst)
在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
。 请查看可使用的列出程序,您会发现最常用的操作已经实施并且可以使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.