memq 用于列表和流
memq for lists and streams
有人能告诉我将这两个专用于从列表中删除重复项的函数更改为最后两个用于流的函数会带来哪些潜在问题
(define (memq item x)
(cond ((null? x ) #f)
((eq? item (car x )) x)
(else (mem item (cdr x)))))
(define (r lst)
(cond ((null? lst) '())
((not (memq (car lst ) (scdr lst)))
(cons(car lst) (r (cdr lst))))
(else (r ( cdr last)))))
在我们有流版本的情况下,如您所见,我在这里所做的就是将 car、cons 和 cdr 更改为流版本。我读到这会有潜在的问题,但我不明白为什么。
(define (memq item x)
(cond ((null? x ) #f)
((eq? item (stream-car x )) x)
(else (memq item (stream-cdr x)))))
(define (r lst)
(cond ((null? lst) '())
((not (memq (stream-car lst ) (stream-cdr lst)))
(cons-stream (stream-car lst) (r (stream-cdr lst))))
(else (r ( stream-cdr lst)))))
流的很大一部分意义在于它们可能是无限的,因为它们是根据需要生成的。当在任何无限流上调用 r
函数的流版本时,它永远不会产生单个值。你能看出这是为什么吗?
有人能告诉我将这两个专用于从列表中删除重复项的函数更改为最后两个用于流的函数会带来哪些潜在问题
(define (memq item x)
(cond ((null? x ) #f)
((eq? item (car x )) x)
(else (mem item (cdr x)))))
(define (r lst)
(cond ((null? lst) '())
((not (memq (car lst ) (scdr lst)))
(cons(car lst) (r (cdr lst))))
(else (r ( cdr last)))))
在我们有流版本的情况下,如您所见,我在这里所做的就是将 car、cons 和 cdr 更改为流版本。我读到这会有潜在的问题,但我不明白为什么。
(define (memq item x)
(cond ((null? x ) #f)
((eq? item (stream-car x )) x)
(else (memq item (stream-cdr x)))))
(define (r lst)
(cond ((null? lst) '())
((not (memq (stream-car lst ) (stream-cdr lst)))
(cons-stream (stream-car lst) (r (stream-cdr lst))))
(else (r ( stream-cdr lst)))))
流的很大一部分意义在于它们可能是无限的,因为它们是根据需要生成的。当在任何无限流上调用 r
函数的流版本时,它永远不会产生单个值。你能看出这是为什么吗?