SICP Lisp/Scheme - 递归 return 值丢失

SICP Lisp/Scheme - recursive return value gets lost

我正在编写一个简单的函数,它递归地检查 x(列表)是否是 remaining(列表的列表)的元素。

不知何故,来自最内层框架的 #f return 没有正确地冒泡到顶部:

#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?

这一定是一些愚蠢简单的东西,但我找不到什么。任何帮助将不胜感激。

cond returns 条件为真(即非 #f)的第一个子句正文中的值,或 else 子句的值如果 none 个是真实的。

如果 none 个条件为真,并且没有 else 子句,则 returns #void.

在您的情况下,none 个条件永远为真,因为递归调用为假。

将最后一个子句更改为 else 子句,这样递归调用的值将被 returned。

(define (was_seen? remaining x)
  (cond ((null? remaining) #false)
        ((eq? (car remaining) x) #true)
        (else (was_seen? (cdr remaining) x))
  )
)

您可能认为您依赖于快捷方式,即如果子句中没有正文,则条件的值是 returned。但这只有在条件为真时才会发生,因此这是要 return 值的子句。当条件为假时,它不适用。