Racket 球拍复印机功能

Racket 球拍复印机功能,racket,Racket,我正在用racket写一个复制函数。replicator函数获取符号和数字L的嵌套列表,并通过在所有级别“立即复制”每个原子(符号或数字)来生成符号和数字的嵌套列表。 例如: (复印机’(a1b2c3))产生(a11b2c3), (复印机’((a 1)b((c))2)产生((a 1)b b((c))2) 以下是我的功能: (define (duplicator ls) (if (null? ls) '() (cons (car ls) (con

我正在用racket写一个复制函数。replicator函数获取符号和数字L的嵌套列表,并通过在所有级别“立即复制”每个原子(符号或数字)来生成符号和数字的嵌套列表。 例如: (复印机’(a1b2c3))产生(a11b2c3), (复印机’((a 1)b((c))2)产生((a 1)b b((c))2)

以下是我的功能:

(define (duplicator ls)
  (if (null? ls)
      '()
      (cons (car ls)
            (cons (car ls)
                  (duplicator (cdr ls))))))
我的问题是,(复印机’((a1)b((c))2))的输出是’((a1)(a1)b((c))((c))2),这不是我想要的。 有人能告诉我怎么做吗?

这里有一个解决方案:

(define (duplicator ls)
  (cond ((null? ls) '())
        ((list? (car ls)) (cons (duplicator (car ls)) (duplicator (cdr ls))))
        (else (cons (car ls) (cons (car ls) (duplicator (cdr ls)))))))

(duplicator '((a 1) b ((c)) 2))  ; produces ((a a 1 1) b b ((c c)) 2 2)

您需要设置当前元素本身是否为列表的条件。如果是,则不应复制,而是以内部列表为参数递归调用复制函数。只有在处于最低级别时才会发生复制。我不太熟悉Racket语法,但我会尝试解决它。