Scheme 方案过滤功能代码含义
我被要求解释以下代码:Scheme 方案过滤功能代码含义,scheme,Scheme,我被要求解释以下代码: (define (filter p l) (cond ((null? l) ’()) (#t (let ((result (filter p (cdr l)))) (if (p (car l)) (cons (car l) result) result))))) 解决方案是“filter返回l中的元素e,其中(pe)是#t” 但我不确定第三条线在做什么。#t是
(define (filter p l)
(cond
((null? l) ’())
(#t (let ((result (filter p (cdr l))))
(if (p (car l))
(cons (car l) result)
result)))))
解决方案是“filter
返回l
中的元素e
,其中(pe)
是#t
”
但我不确定第三条线在做什么。
#t
是否表示我们始终接受此条件?“let”在这种情况下是如何工作的?它的格式有点奇怪,但这里的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->do this other stuff是默认情况,因为它总是在列表不为空时执行,这将触发(null?l)。因此,它必须是最后一行。使用标准缩进-将表达式拆分,并将每个子表达式放在自己的行中,这样它就会变得清晰。-#t案例:是的,这是真的,所以它成功了,子句被执行了——除非选择了上面的一个子句。@WillNess谢谢!这确实让问题变得更清楚了。@Willenss如果是这样的话,在编辑问题时,除了将代码还原为错误格式外,还可以对其进行编辑,询问正确的格式,这样答案才有意义。@benrudgers我可能遗漏了一些内容,因此我将根据您的判断撤消回滚。