我正在尝试提取符号' 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;
任何评论都会有所帮助..
答案 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)