访问Racket中的存储列表

时间:2013-06-16 20:16:52

标签: scheme racket

有没有办法在不传递新数据的情况下访问Racket中的存储列表?在我正在处理的程序中使用以下代码存储过去的响应列表。

(define (storage response lst)
  (cons response lst))

这通过对问题和先前列表做出回答来制作列表。我不想改变列表中的内容只是看看里面有什么。如果需要其他代码,我将很乐意展示我的内容。

3 个答案:

答案 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中访问列表元素的标准方法是使用firstrest过程(或等效地:carcdr)递归迭代名单。例如,假设您要查明列表是否包含"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,您将看到最常用的操作已经实施并随时可用。