从列表

时间:2017-04-16 19:07:42

标签: 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) 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))给出了错误application: not a procedure;

任何评论都会有所帮助..

1 个答案:

答案 0 :(得分:2)

您的代码中存在大量语法错误(主要是处理括号的错误使用)。正如评论中所提到的,在处理任何其他问题之前,您应该花一些时间熟悉语言的语法。话虽如此,这是我认为你打算做的,研究以下解决方案,并注意这些括号!

(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)