Scheme 从列表中提取元素

Scheme 从列表中提取元素,scheme,Scheme,我试图提取所有符号为“sym”的元素 从列表中选择 (define (extract-sym list) extract-sym-inner (list null)) (define (extract-sym-inner oldList newList) (cond (null? oldList (newList)) (eq? (car oldList) newList (extract-sym-inner((cdr oldList)

我试图提取所有符号为“sym”的元素 从列表中选择

(define (extract-sym list)
  extract-sym-inner (list null))

(define (extract-sym-inner oldList newList)
  (cond (null? oldList
         (newList))
        (eq? (car oldList) newList
         (extract-sym-inner((cdr oldList) append newList (extract-sym(oldList)))))
        (eq? (car oldList) 'sym
         (extract-sym-inner((cdr oldList) cons newList(car oldList))))
        (else
         (extract-sym-inner(cdr oldList newList)))))
我想做的是:
将列表发送到内部函数,然后:
1. 如果为空,则返回新列表
2. 否则如果元素本身是一个列表,则将外部函数中的列表附加到新列表中,并继续到旧列表的下一个元素
3. 否则,如果该元素的符号为“sym”,则将其插入新列表并继续到旧列表的下一个元素
4. 其他继续到旧列表的下一个元素

我认为算法本身应该可以工作,但我无法理解我遇到的所有编译错误。例如
(extract sym'(1 2 sym))
给出了错误
应用程序:不是一个过程


任何评论都会有帮助

代码中有很多语法错误(主要是处理括号的错误用法)。正如评论中提到的,在解决任何其他问题之前,您应该先花一些时间熟悉该语言的语法。话虽如此,这就是我相信您打算做的,请研究以下解决方案并注意这些括号

(define (extract-sym lst)                  ; don't use "list" as a parameter name
  (cond ((null? lst) '())                  ; if list is empty, return empty list
        ((eq? (car lst) 'sym)              ; if current element is 'sym
         (cons (car lst)                   ; add it to the output using cons
               (extract-sym (cdr lst))))   ; and advance recursion
        ((pair? (car lst))                 ; if current element is a list
         (append (extract-sym (car lst))   ; recursively process and use append
                 (extract-sym (cdr lst)))) ; also, advance recursion
        (else (extract-sym (cdr lst)))))   ; otherwise just advance recursion
例如:

(extract-sym '(1 sym 2 (3 sym 4) (5) sym))
=> '(sym sym sym)

由于不正确地使用括号,程序中有许多语法错误,不能像在其他编程语言中那样自由使用。你可以在任何一本关于Scheme的书上读到Scheme的语法,但不清楚当一个元素是一个列表时,你为什么要以不同的方式处理,或者在这种情况下你想做什么。您应该提供一个精确的示例,其中包含示例输入和您在本例中希望执行的操作的预期输出。