Recursion 如何编写一个Scheme过程,它接受一个格式错误的列表并返回一个具有相同结构的格式正确的列表?

Recursion 如何编写一个Scheme过程,它接受一个格式错误的列表并返回一个具有相同结构的格式正确的列表?,recursion,scheme,nested-lists,Recursion,Scheme,Nested Lists,我正在尝试实现一个Scheme过程,它接受一个可能格式不正确的嵌套数字列表,并返回一个具有相同内容和结构的嵌套列表,但在显示时没有任何点 示例: scm> (reform '((1 . 2) 3)) ((1 2) 3) scm> (reform '(1 (2 3 . 4) . 3)) (1 (2 3 4) 3) scm> (reform '(1 . ((2 3 . 4) . 3))) (1 (2 3 4) 3) 我当前的解决方案: (define (reform s) (

我正在尝试实现一个Scheme过程,它接受一个可能格式不正确的嵌套数字列表,并返回一个具有相同内容和结构的嵌套列表,但在显示时没有任何点

示例:

scm> (reform '((1 . 2) 3))
((1 2) 3)
scm> (reform '(1 (2 3 . 4) . 3))
(1 (2 3 4) 3)
scm> (reform '(1 . ((2 3 . 4) . 3)))
(1 (2 3 4) 3)
我当前的解决方案:

(define (reform s)
  (cond
   ((null? s) nil)
   ((number? s) s)
   ((null? (cdr s)) (car s))
   (else (list (reform (car s)) (reform (cdr s))))
  )
)
这个解决方案确实删除了所有的点,但并没有保持输入的形式。如何重写实现,使其不会创建输入中不存在的额外列表?

这通过了测试

(define (reform xs)
  (cond
    [(null? xs) xs]
    [(and (pair? xs) (pair? (cdr xs)))
     (cons (reform (car xs)) (reform (cdr xs)))]
    [(and (pair? xs) (null? (cdr xs)))
     (list (reform (car xs)))]
    [(pair? xs)
     (cons (reform (car xs)) (list (reform (cdr xs))))]
    [else xs]))

(reform '((1 . 2) 3))
(reform '(1 (2 3 . 4) . 3))
(reform '(1 . ((2 3 . 4) . 3)))

不确定为什么@soegaard有这么多测试,不管列表是一对还是一对,最明显的是先做异常:

(定义(点->正确的X)
(cond((null?xs)')())
((不是(对X))(列表X))
((配对)(车X))(cons(点->正确(车X))(点->正确(cdr X)))
(其他(cons(car-xs)(dot->property(cdr-xs()())))
(点->正确的'((1.2)3));=>((1 2) 3)
(点->正确的’(1(23.4.3));=>(1 (2 3 4) 3)
(点->正确的’(1.((23.4.3));=>(1 (2 3 4) 3)