Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 方案过滤功能代码含义_Scheme - Fatal编程技术网

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我可能遗漏了一些内容,因此我将根据您的判断撤消回滚。