Scheme 从列表中提取元素
我试图提取所有符号为“sym”的元素 从列表中选择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)
(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的语法,但不清楚当一个元素是一个列表时,你为什么要以不同的方式处理,或者在这种情况下你想做什么。您应该提供一个精确的示例,其中包含示例输入和您在本例中希望执行的操作的预期输出。