【发布时间】:2021-09-20 00:01:16
【问题描述】:
我正在编写一个简单的函数,它递归检查x(列表)是否是remaining(列表列表)的元素。
不知何故,从最里面的框架返回的#f 没有正确地冒泡到顶部:
#lang sicp
(define (was_seen? remaining x)
(cond ((null? remaining) #false)
((eq? (car remaining) x) #true)
((was_seen? (cdr remaining) x))
)
)
; test variables
(define seen (list(list 'a)))
(define z (list 0))
; now the test
(was_seen? seen z)
; expected: #f; returns blank (evaluated to #void when seen via debugger)
(was_seen? (cdr seen) z)
; expected: #f; returns #f as it should.
; This is what the inner (recursive) call - correctly - evaluates to.
; It's just that this #f doesn't get properly returned to the global caller?
这一定是一些愚蠢的简单,但我找不到什么。任何帮助将不胜感激。
【问题讨论】:
-
提示:
((was_seen? (cdr remaining) x))子句返回什么? -
为什么
(null? x)时返回false?列表列表可以包含一个空列表。 -
@coredump 在这种情况下,它将评估为
#false,因为(cdr remaining)是空的,所以它将命中cond的第二个谓词。
标签: list recursion scheme lisp sicp