Functional programming 函数,该函数用于创建列表中元素出现的所有索引的列表

Functional programming 函数,该函数用于创建列表中元素出现的所有索引的列表,functional-programming,scheme,lisp,Functional Programming,Scheme,Lisp,我正在尝试编写一个函数(位置N a L),它返回a出现在L中的每个索引的列表,N是给定给L的第一个元素的数字 比如说, (位置0'a'(a b c a d e a))=>(03 6) (位置1'a'(a b c a d e a))=>(14 7) 到目前为止,我已经想到了这个(它不能正常工作): 试试这个: (define (positions N A L) (cond ((null? L) '()) ((equal? (car L) A) (cons N

我正在尝试编写一个函数
(位置N a L)
,它返回a出现在L中的每个索引的列表,N是给定给L的第一个元素的数字

比如说,

(位置0'a'(a b c a d e a))
=>
(03 6)

(位置1'a'(a b c a d e a))
=>
(14 7)

到目前为止,我已经想到了这个(它不能正常工作):

试试这个:

(define (positions N A L)
  (cond
    ((null? L)          '())
    ((equal? (car L) A) (cons N (positions (+ N 1) A (cdr L))))
    (else               (positions (+ N 1) A (cdr L)))))
问题是
=
仅为数字定义。如果确定列表中只包含符号,请使用
eq?
。否则请使用
equal?
,这是最通用的相等比较,适用于许多数据类型(数字、符号、布尔值等)。此外,对于最后一个条件,请使用
else
,使用
#t
是一种常见的Lisp约定,在Scheme中不适用。

尝试以下方法:

(define (positions N A L)
  (cond
    ((null? L)          '())
    ((equal? (car L) A) (cons N (positions (+ N 1) A (cdr L))))
    (else               (positions (+ N 1) A (cdr L)))))

问题是
=
仅为数字定义。如果确定列表中只包含符号,请使用
eq?
。否则使用
equal?
,这是最通用的相等比较,适用于许多数据类型(数字、符号、布尔值等)。此外,对于最后一个条件,请使用
else
,使用
#t
是一种常见的Lisp约定,在Scheme中不适用。

请详细说明此函数的行为与您想要的行为有何不同。您使用
=
比较任意对象(本例中为符号),这实际上是为数字保留的。尝试改用
eqv?
。或者考虑将测试函数作为附加(可选)参数传递。此外,在<代码> COND 的最后一个子句中,<代码> < t >代码>希望可以是<代码>否则<代码>(即<代码>(COND((…)……(另…))< /代码>)@ DRK,这是解决方案!我试过使用
eq
eqv
eql
equal
,但忘了将
添加到所有这些工具中!在这种情况下,使用
#t
else
有什么区别?如果函数达到该点,您会希望它始终移动到列表的下一个元素并进行检查。换句话说,如果达到该点,您希望它始终被计算为true。请详细说明此函数的行为与您想要的行为有何不同。您正在使用
=
比较任意对象(在本例中为符号),这实际上是为数字保留的。尝试改用
eqv?
。或者考虑将测试函数作为附加(可选)参数传递。此外,在<代码> COND 的最后一个子句中,<代码> < t >代码>希望可以是<代码>否则<代码>(即<代码>(COND((…)……(另…))< /代码>)@ DRK,这是解决方案!我试过使用
eq
eqv
eql
equal
,但忘了将
添加到所有这些工具中!在这种情况下,使用
#t
else
有什么区别?如果函数达到该点,您会希望它始终移动到列表的下一个元素并进行检查。换句话说,如果达到该点,您希望它始终被评估为true