我被要求解释以下代码:
(define (filter p l)
(cond
((null? l) ’())
(#t (let ((result (filter p (cdr l))))
(if (p (car l))
(cons (car l) result)
result)))))
,解决方案为" filter
返回e
中l
为(p e)
" {}的#t
元素
但我不确定第3行是做什么的。是#t
说我们总是接受这种情况吗?另外,' let'在这种情况下工作?
答案 0 :(得分:3)
它的格式有点奇怪,但是cond在这里起着来自haskell或ML的匹配表达式的作用:
match l with
| [] -> []
| x :: xs ->
let result = filter p xs in
(if p x then
x :: result
else
result
)
Cond需要成对(执行 - 执行?),因此它应该更像这样读取
(cond
((null? l) ’())
(#t (let ((result (filter p (cdr l))))
(if (p (car l))
(cons (car l) result) ;; then
result) ;; else
)))
所以#t - >这样做的其他东西是默认情况,因为它总是在列表不为空时执行,这会触发(null?l)。因此它必须是最后的。