List Scheme函数-获取一个原子和一个列表,并返回新列表,其中给定的原子实例将从给定列表中删除

List Scheme函数-获取一个原子和一个列表,并返回新列表,其中给定的原子实例将从给定列表中删除,list,scheme,List,Scheme,此代码生成以下错误 car:需要类型为的参数;给定f 您似乎正在使用交换的参数调用remover。如果你这样称呼它: (define (remover lst n) (cond ((null? lst) ()) ((eq? (car lst) n) (cdr lst)) (else (cons (car lst) (remover (cdr lst) n))))) (remover 'f '(a f c g f b)) 您将得到结果(a c g f b

此代码生成以下错误

car:需要类型为的参数;给定f


您似乎正在使用交换的参数调用
remover
。如果你这样称呼它:

(define (remover lst n)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (cdr lst))
        (else (cons (car lst) (remover (cdr lst) n)))))

(remover 'f '(a f c g f b))
您将得到结果
(a c g f b)

由于要删除所有出现的
f
,还必须将
(cdr lst)
更改为
(remover(cdr lst)n)
,如下所示:

(remover '(a f c g f b) 'f)
(define (remover lst n)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (remover (cdr lst) n))
        (else (cons (car lst) (remover (cdr lst) n)))))
然后
(卸除器(a f c g f b)'f)
也应产生预期结果
(a c g b)

要切换
remover
的参数,您必须在定义和递归调用中切换它们,如下所示:

(remover '(a f c g f b) 'f)
(define (remover lst n)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (remover (cdr lst) n))
        (else (cons (car lst) (remover (cdr lst) n)))))

根据参数名判断,我假设
lst
应该是一个列表,而不是符号
f
。操作
car
仅适用于成对和列表,而不适用于符号。另外,
n
是数值参数的典型名称,如
5
,而不是列表。例如,使用
(define(list ref lst n)…
很明显,列表是命名约定中的第一个参数,索引是第二个参数。这非常有用。有没有一种方法可以得到(除去器'f'(af-c-g-f-b))顺序的结果,就像(a-c-g-b)我是新手一样scheme@AmanieWickramanayake顺序由您在过程的参数列表中定义。您已经选择了
lst
,然后像
(define(remover lst n)…
那样编写时选择了
n
。您可以选择名称和顺序。如果保留名称,则通过将其设置为
(remover n lst)
来进行切换。您还需要通过切换函数的顺序来更新调用函数的位置。@AmanieWickramanayake我已经在答案中添加了如何切换参数的说明。好的!我现在完全明白了。非常感谢您@Sylvester和martin_joerg