1

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

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

这通过对问题和先前列表的响应来制作列表。我不想更改列表中的内容,只是简单地查看其中的内容。如果需要其他代码,我将很乐意展示我所拥有的。

4

3 回答 3

0

在 Racket 中访问列表元素的标准方法是使用firstandrest过程(或等效:carand 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其他答案中所建议的。请查看可用的程序列表,您会发现最常用的操作已经实现并可供您使用。

于 2013-06-16T22:08:16.583 回答
0

是的,有一种方法可以访问存储的列表,而无需将其作为新数据传递。有关“列表访问”功能的完整列表,请参见方案 R5RS 规范中的第 25 页第 6.3.2 节。球拍可能有更多;其他 Scheme 版本可能还有其他版本。

这是一个例子。要测试是否已经看到“响应”:

  (member response lst)

计算响应数:

  (length lst)
于 2013-06-16T21:38:20.550 回答
0

按照当前的构造,您创建了一个名为 storage 的函数,该函数接受 response 和一个列表,并返回一个新列表,其中 response 作为头部,lst 作为尾部。

如果你想得到它的头部或尾部,(storage a l)那么你只需调用(car (storage a l))(cdr (storage a l))- 它只是一个列表。

于 2013-06-16T20:25:15.153 回答